我有一个Spring启动项目,我正在迁移到Spring boot 2。 我的一些测试表明,使用旧版本时,使用旧版本的测试失败了。
这个问题很容易重现。
我创建了2个Controller。在第一个,我注入一个服务。在第二个中,我注入了一个JpaRepository。
现在我为这个Controller创建了UnitTests。 对于第二个Controller,我模拟了Repository。一切正常。 对于第一个控制器,我模拟了服务。测试失败。 它似乎搜索注入存储库,而它没有在此控制器中使用。
我创建了一个非常简单的项目来重现这种行为: https://github.com/YLombardi/mockito-spring-jpa-issue
我的测试是错误还是错误?
答案 0 :(得分:1)
我能够从您提供的repo url重现该问题。如果您在运行ControllerAUnitTests
时发现异常,则说明
...UnsatisfiedDependencyException: Error creating bean with name 'controllerB'...
现在,当你运行controllerB
的测试时,为什么spring会尝试加载ControllerA
bean?
这是因为您使用的是SpringRunner
和默认mockMvc
。它加载整个spring上下文,这意味着它将创建包含controllerB
的每个组件的bean。
要创建controllerB
的bean,您需要拥有JpaRepo
的实例。所以,就像你在ServiceA
中创建了ControllerAUnitTests
的模拟bean一样,你也需要为JpaRepo
创建模拟bean。
@MockBean
private ServiceA serviceA;
// NOTE THIS BLOCK
@MockBean
private JpaRepo jpaRepo;
@Test
public void test() throws Exception {
doReturn("a").when(serviceA).getAString();
mockMvc.perform(get("/a"))
.andDo(print())
.andExpect(status().isOk())
// Test now runs but assert fails below, that you need to fix.
.andExpect(view().name("aview"))
.andExpect(content().string("a"));
}