监视具有事务方法的服务弹簧

时间:2019-06-28 08:06:46

标签: java spring junit service spy

我正在尝试编写一些JUnit测试。在测试类中,我需要监视实现中具有事务方法的服务。当我尝试监视该服务时,出现此错误:

jdk

如果我从方法中删除了Mockito cannot mock/spy because : - final class ,则间谍工作正常。我了解这是由于服务代理引起的问题。我该如何解决?

我的考试班:

@Transactional

我的服务-@RunWith(SpringRunner.class) @ContextConfiguration(classes = {CreateIfcClusterTaskTest.Config.class}) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) public class CreateIfcClusterTaskTest { static class Config extends SpringTestConfiguration { @Bean @Primary public VirtualControllerService virtualControllerService(VirtualControllerService virtualControllerService) { return Mockito.spy(virtualControllerService); } } }

VirtualControllerService

我的服务隐含-public interface VirtualControllerService { JsonHost createVifcHostForWebApi(VirtualController virtualController); void stopDocker(DockerClient docker, String joinerIpAddress) throws DockerException, InterruptedException; }

VirtualControllerServiceImpl

2 个答案:

答案 0 :(得分:1)

根据我发现的this问题,一种可能的解决方法是使用

  

因此,而不是:spy(proxy)可以使用模拟(TestSubject.class,delegatesTo(springProxy))。

就您而言(未经我试用),可能是

return Mockito.mock(VirtualControllerService.class, AdditionalAnswers.delegatesTo(virtualControllerService));

有关更多信息,请参见AdditionalAnswers.delegateTo。请注意,您不能在所监视的实例中存根或验证内部方法调用(仅会跟踪对模拟对象的方法调用)。用例:

  

对于无法使用常规间谍API进行模拟或间谍的对象的间谍或部分模拟很有用。可能的用例:已经是自定义代理对象

答案 1 :(得分:0)

您可以在测试类CreateIfcClusterTaskTest中使用@Mock注释来模拟服务实例,而不是在配置中创建Service类的bean。

它看起来像这样:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes = { CreateIfcClusterTaskTest.Config.class })
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
public class CreateIfcClusterTaskTest {

    @Mock
    VirtualControllerService virtualControllerService;
}

您将必须使用Mockito的注释来初始化对象,如下所示:

@Before
public void setUp() throws Exception {
    MockitoAnnotations.initMocks(this);
}

希望有帮助。