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

我正在尝试编写一些 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:


@Service

public 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;

    }


}


红糖糍粑
浏览 64回答 2
2回答

智慧大石

根据我发现的这个问题,一种可能的解决方法是使用因此,代替 spy(proxy) 使用 mock(TestSubject.class, delegatesTo(springProxy))。在你的情况下(未经我测试),那可能是return Mockito.mock(VirtualControllerService.class, AdditionalAnswers.delegatesTo(virtualControllerService));AdditionalAnswers.delegateTo有关详细信息,请参阅。请注意,您无法在您的间谍实例中对内部方法调用进行存根或验证(只会跟踪对模拟对象的方法调用)。用例:对于使用通常的间谍 API 难以模拟或监视的对象的间谍或部分模拟很有用。可能的用例:已经自定义代理对象

冉冉说

您可以在测试类中使用 @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 的注释初始化对象,如下所示:@Beforepublic void setUp() throws Exception {    MockitoAnnotations.initMocks(this);}希望有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java