我正在尝试编写一些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
答案 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);
}
希望有帮助。