【问题标题】:Mockbean containing autowired dependency包含自动装配依赖项的 Mockbean
【发布时间】:2019-03-06 14:41:40
【问题描述】:

我正在测试一个依赖于 bean 的类。在测试中,我模拟了 bean,但模拟的 bean 也有它自己的 @Autowired 依赖项。无论如何我可以满足这种依赖吗?现在,当调用 mock 中的方法时,@Autowired 依赖项为 null。

例子:

public class testclass {
    @Autowired
    private ClassToTest classToTest;
    @MockBean
    private DependencyOfClassToTest dependencyOfClassToTest;
    @Mockbean
    private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}

public class DependencyOfClassToTest {
    @Autowired
    private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
}

如上所示,模拟 bean 包含一个 @Autowired 依赖项。

对此有任何解决方案还是我违反了某种测试规则?

当模拟 bean 中的实际方法被调用时,它会调用 myOwnDependencyINeedHereInTheMock,因为它是一个模拟 bean,所以该方法为 null。

MockBeans 在 @Autowired 类中不是 null,因此它们可以被 Spring Boot 找到。

【问题讨论】:

  • 您确定您的测试使用的是 bean 的模拟版本吗?如果是,“真实”bean 的内部不应该是相关的,真正的 bean 碰巧有其他依赖项的事实是无关紧要的,这就是 mock 的重点。
  • @DaveyDaveDave 是的,除了该注释之外,我不会以任何其他方式将 bean 提供给我正在测试的类。
  • 我认为您可能需要显示更多代码 - 您是否能够编辑您的帖子以包含测试(希望是 MCVE)?还有,你怎么知道MyOwnDependencyINeedHereInTheMock 是空的?
  • 如果你在模拟对象上调用方法,它总是会返回空值,你可能认为它发生是因为你的 MyOwnDependencyINeedHereInTheMock 没有自动装配,但看起来你不知道如何使用模拟.您应该预定义被调用方法的行为。在这种情况下,如果您调用该方法,它应该返回您的预定义值,并且模拟对象内部的内容无关紧要(我的意思是MyOwnDependencyINeedHereInTheMock 和另一个对象可以为空)。否则你测试配置有问题,你在真实对象上调用方法。

标签: java spring mockito spring-test


【解决方案1】:

也模仿那个豆子!

    public class testclass {
        @Autowired
        private ClassToTest classToTest;
        @MockBean
        private DependencyOfClassToTest dependencyOfClassToTest;
        @MockBean
        private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
    }

    public class DependencyOfClassToTest {
        @Autowired
        private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;
    }

更新:下面的测试类对我有用

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Autowired
    private ClassToTest classToTest;
    @MockBean
    private DependencyOfClassToTest dependencyOfClassToTest;
    @MockBean
    private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;

    @Test
    public void contextLoads() {

        System.out.println("test"+myOwnDependencyINeedHereInTheMock);
    }



    @TestConfiguration  
    static class Context{

        @Component
         static class ClassToTest{

            @Autowired
            private DependencyOfClassToTest  dependencyOfClassToTest;
        }

        @Component
         static class DependencyOfClassToTest{
            @Autowired
            private MyOwnDependencyINeedHereInTheMock myOwnDependencyINeedHereInTheMock;


        }

        @Component
         static class MyOwnDependencyINeedHereInTheMock{

        }


    }
}

【讨论】:

  • 我已经尝试过了,但它不起作用。 MockBeans 仅在 @Autowired 字段中不为空。
  • 在您给出的示例中,ClassToTest 应该是被测试的类,并且它应该在其中自动装配 DependencyOfClassToTest,但它没有。
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
相关资源
最近更新 更多