模拟存储库调用的返回实体返回null

问题描述 投票:0回答:1

代码段根据参数检索实体。

public void updateNotification(String status, Entity entity ) {
        Entity entity1 = null;
        try {
            switch (status) {
            case "AX":
                entity1 = this.Repository.findByTypeAndParams(
                        1, entity.getParam1(), entity.getParam2(),
                        entity.getParam3());
                if (entity1!= null) {
                    entity1.setCurrentStatusKey("SET");
                    updateEntity(entity1);
                } else {
                    LOGGER.debug("");
                }
                break;

上述代码的测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
public class ServiceTest {
    @InjectMocks
    CVService cVServiceMock;

    @Mock
    RepositoryMock repositoryMock;

     @Test
            public void testUpdateOut() {
                Entity entity1 = new Entity ();
                entity1.setType(2);
                Mockito.when(repositoryMock.findByTypeAndParams(any(Integer.class), any(String.class),
                        any(String.class), any(String.class))).thenReturn(entity1);
                cVServiceMock.updateNotification("AX", entity1);
            }

从测试用例执行时,entity1始终为null而不是模拟实体,我在这里错了吗?

java spring-boot spring-data-jpa mockito mockmvc
1个回答
0
投票

如另一个StackOverflow MariuszS' answer about Mocking static methods with Mockito中所述:

在Mockito的顶部使用PowerMockito。>>

[...]

更多信息:

PowerMockito添加了更多功能,它允许模拟私有方法,静态方法等。

有了这个,您应该模拟Repository的实例:

// In your test method
PowerMockito.mockStatic(Repository.class);

不要忘记在测试类中添加注释:

@RunWith(PowerMockRunner.class)
@PowerMockRunnerDelegate(SpringRunner.class) // Since you are using SpringBoot
@PrepareForTest(Repository.class)
@PowerMockIgnore({"javax.management.*", "javax.net.ssl.*", "javax.security.*"}) // Avoid certain classloading related issues, not mandatory

在我的示例中,Mockito.when()替换为PowerMockito.doReturn(...).when(...)。它看起来可能如下所示:

@Test
public void testUpdateOut() {
    Entity entity1 = new Entity ();
    entity1.setType(2);
    PowerMockito.mockStatic(Repository.class);

    PowerMockito.doReturn(entity1).when(
        Repository.class,
        "findByTypeAndParams", // The name of the method
        Mockito.anyInt(), // The arguments
        Mockito.anyString(),
        Mockito.anyString(),
        Mockito.anyString()
    );

    // Your test
    notificationServiceMock.updateNotification("AX", entity1);

    // And at the end of the test:
    PowerMockito.verifyStatic(); // It will verify that all statics were called one time
}

请注意,我分别用any(Integer.class)any(String.class)替换了anyInt()anyString()

我希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.