为了账号安全,请及时绑定邮箱和手机立即绑定

监视具有事务方法的服务 spring

监视具有事务方法的服务 spring

红糖糍粑 2023-02-23 10:29:00
我正在尝试编写一些 JUnit 测试。在我的测试类中,我需要监视在实现中具有事务方法的服务。当我试图监视该服务时,出现此错误: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:@Servicepublic class VirtualControllerServiceImpl implements        VirtualControllerService {    @Override    @Transactional    public JsonHost createVifcHostForWebApi(VirtualController                                                    virtualController) {        JsonHost jsonHost = new JsonHost();        jsonHost.setIP(virtualController.getIpAddress());        jsonHost.setUser(environment.getProperty("VIFC_WEBAPI_USER"));        jsonHost.setPassword(environment.getProperty("VIFC_WEBAPI_PASSWORD"));        return jsonHost;    }}
查看完整描述

2 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

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

因此,代替 spy(proxy) 使用 mock(TestSubject.class, delegatesTo(springProxy))。

在你的情况下(未经我测试),那可能是

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

AdditionalAnswers.delegateTo有关详细信息,请参阅。请注意,您无法在您的间谍实例中对内部方法调用进行存根或验证(只会跟踪对模拟对象的方法调用)。用例:

对于使用通常的间谍 API 难以模拟或监视的对象的间谍或部分模拟很有用。可能的用例:已经自定义代理对象


查看完整回答
反对 回复 2023-02-23
?
冉冉说

TA贡献1877条经验 获得超1个赞

您可以在测试类中使用 @Mock 注释CreateIfcClusterTaskTest来模拟服务实例,而不是在您的配置中创建服务类的 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);

}

希望有所帮助。


查看完整回答
反对 回复 2023-02-23
  • 2 回答
  • 0 关注
  • 63 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信