gpt4 book ai didi

java - spring mvc 模拟存储库

转载 作者:行者123 更新时间:2023-12-01 06:11:25 24 4
gpt4 key购买 nike

我正在学习 spring 并编写一个简单的 spring boot 应用程序。我想为我的 Controller 编写一个单元测试。 Controller 与我想出于测试目的而模拟的存储库进行交互。使用各种教程和文档,我得到了以下结果:

我的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes={TestConfiguration.class,MyWebappApplication.class})
@WebAppConfiguration
public class MyWebappApplicationTests {

private MockMvc mockMvc;

@Autowired
private MyRepository myRepositoryMock;

@Autowired
private WebApplicationContext webApplicationContext;

@Before
public void setUp() {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}

@Test
public void contextLoads() throws Exception {


MyEntity e1 = new MyEntity();
e1.setId(1);
e1.setDescription("e1");

MyEntity e2 = new MyEntity();
e2.setId(2);
e2.setDescription("e2");

when(myRepositoryMock.findAll()).thenReturn(Arrays.asList(e1, w2));



mockMvc.perform(get("/"))
.andExpect(status().isOk());

}

}

我的 TestConfigiration 提供模拟存储库:

@Configuration
public class TestConfiguration {

@Bean
public MyRepository myRepository() {
return Mockito.mock(MyRepository.class);
}

}

当我运行测试时,我没有将模拟存储库注入(inject)到测试中,而是得到了真实的存储库,并且在日志输出中得到以下行:

Overriding bean definition for bean 'myRepository' with a different definition: replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=2; dependencyCheck=0; autowireCandidate=true; primary=true; factoryBeanName=testContext; factoryMethodName=ideaRepository; initMethodName=null; destroyMethodName=(inferred); defined in murdoch.suppriseme.TestContext] with [Root bean: class [org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean]; scope=; abstract=false; lazyInit=false; autowireMode=0; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=null; factoryMethodName=null; initMethodName=null; destroyMethodName=null]

我尝试在 bean 上使用 @Primary 注释来使其优先,但这不起作用。我错过了什么?

最佳答案

您应该能够通过遵守@Qualifier来解析正确的实例

所以

@Configuration
public class TestConfiguration {

@Bean
@Qualifier("mock")
public MyRepository myRepository() {
return Mockito.mock(MyRepository.class);
}

}

在你的测试中

@Autowired
@Qualifier("mock")
private MyRepository myRepositoryMock;

关于java - spring mvc 模拟存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34071186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com