Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过直接使用上下文检索的Spring/Mock组件_Java_Spring_Testing_Mockito - Fatal编程技术网

Java 通过直接使用上下文检索的Spring/Mock组件

Java 通过直接使用上下文检索的Spring/Mock组件,java,spring,testing,mockito,Java,Spring,Testing,Mockito,我们有一个使用Spring注释来配置其上下文的项目。 为了测试这个项目,我们使用了Mockito和它的Spring扩展 在测试中,我需要用mock/spy版本覆盖一些bean 通过@Mock/@Spy和@InjectMock注释,我已经能够使用Spy for Bean,使用自动布线机制 现在我有了一个第三方组件,它创建了另一个Spring上下文,然后将这两个上下文合并在一起。此第三方组件使用对上下文的调用检索bean: applicationContext.getBean(key); 在本例中

我们有一个使用
Spring
注释来配置其上下文的项目。 为了测试这个项目,我们使用了
Mockito
和它的
Spring
扩展

在测试中,我需要用mock/spy版本覆盖一些bean

通过
@Mock
/
@Spy
@InjectMock
注释,我已经能够使用Spy for Bean,使用自动布线机制

现在我有了一个第三方组件,它创建了另一个Spring上下文,然后将这两个上下文合并在一起。此第三方组件使用对上下文的调用检索bean:

applicationContext.getBean(key);
在本例中,@Mock/@Spy和@InjectMock组合不起作用

我采用的“变通”解决方案是一个XML文件,我在其中声明了我的spied bean:

<mockito:spy beanName="beanToSpy"/>
要使用模拟bean的测试类:

public class MyTest extends BaseTest {
  @ReplaceWithMock @Autowired MyService myService;
  @WrapWithSpy @Autowired OtherService otherService;

  @Test public void someTest() { 
    doReturn(x).when(myService).call();
    doReturn(y).when(otherService).process();
  }
}
不幸的是,在
MyTest
中,bean没有被它们的
mock
/
spy
版本所取代,它是普通的旧常规版本

编辑: 执行查找的第三方组件使用自己的spring父上下文,并将当前spring上下文添加到自己的父上下文中。检索要模拟的组件的查找发生在上下文完全加载之后

我应该怎么做才能正确地用
mock
/
spy
版本替换上下文中的bean?
我使用
@WrapWithSpy
/
@ReplaceWithMock
的方式有什么问题?

执行此操作的更传统的方式是根据需要在测试中对其进行模拟:

public class MyTest extends BaseTest {
    @Test public void someTest() { 
        MyService myMockService = Mockito.mock(MyService.class);
        // define when's
       // perform verification
      }
您可以使用SpringReflectionTestUtils进行注入,或者如果使用setter注入,只需正常设置即可

如果在具有多个测试的测试类中使用全局模拟bean,结果可能会令人困惑。

何时调用

applicationContext.getBean(key);
发生了什么?它是否可能在SpringockitoContextLoader有机会用间谍替换它之前检索bean

留在注释世界中的一个解决方案是重写java配置中的bean:

@Bean
public MyBeanType myBeanType() {
    return spy(new MyBeanType(...))
}

我想要的是一个全局模拟bean。这很好,因为在每个测试之间都会刷新上下文(@DirtiesContext)。我需要这个,因为我不是直接测试组件;模拟服务将被检索并由具有上下文访问权限的第三方组件使用。我需要“间谍”服务,以便当第三方组件将使用它时,我可以测试它的行为。(我们正在测试activiti工作流流程,这就是我们设置此设置的原因)因此,使用的解决方案有效,您想用注释替换吗?@frant.hartm是的,我不能再睡了;)谢谢你,我会试试这个选择,我会让你知道的。
@Bean
public MyBeanType myBeanType() {
    return spy(new MyBeanType(...))
}