【问题标题】:Mockito always returns null as a result of calling an EJB由于调用 EJB,Mockito 总是返回 null
【发布时间】:2020-04-10 20:39:57
【问题描述】:

我试图调用这个类的第二个方法,总是得到null。请注意,它返回new User(),但是在测试类中我总是得到null

@Stateless
public class UserDAO2 {

    public Connection getConnFromPool(int i) {
        return null;
    }

    public User readByUserid(String s) {
        System.out.println("In DAO 2");
        Connection c = getConnFromPool(1);
        return new User();
    }
}

还有测试类:

@RunWith(MockitoJUnitRunner.class)
public class UserBeanUnitTest {

    @InjectMocks
    private UserDAO2 dao2;

    @Before
    public void setup() {
        dao2 = Mockito.mock(UserDAO2.class);
        MockitoAnnotations.initMocks(this);
    }


    @Test
    public void testBean() {

        Mockito.when(dao2.getConnFromPool(1)).thenReturn(null);

        User expectedUser = new User();
        expectedUser.setSk(1);
        expectedUser.setFirstName("David");
        expectedUser.setLastName("Gahan");
        expectedUser.setUserid("user1");

        User user = dao2.readByUserid("user1"); // <-- this method always returns null

        assertThat(user).isEqualTo(expectedUser); // <-- test fails as expectedUser != null

    }

}

另外,请注意System.out.println 永远不会被打印出来。如何解决此问题以实际拨打dao.readByUserid()

【问题讨论】:

    标签: java mockito ejb java-ee-8


    【解决方案1】:

    如果您需要测试某个类的方法,并且在其中调用了您要模拟的同一类的另一个方法,那么您需要使用@Spy

    @RunWith(MockitoJUnitRunner.class)
    public class UserDAO2Test {
    
        @InjectMocks
        @Spy
        private UserDAO2 dao;
    
        @Test
        public void testBean() {
    
            Mockito.doReturn(null).when(dao).getConnFromPool(1);
    
            User expectedUser = new User();
            expectedUser.setSk(1);
            expectedUser.setFirstName("David");
            expectedUser.setLastName("Gahan");
            expectedUser.setUserid("user1");
    
            User user = dao.readByUserid("user1");
    
            assertThat(user).isEqualTo(expectedUser);
        }
    }
    

    请注意,我使用模拟 getConnFromPool 稍微修改了该行,因为在您使用该技术时需要它。

    请参阅docs 进行间谍活动。

    【讨论】:

    • 我确实需要模拟课程,因为我需要这样做Mockito.when(dao.getConnFromPool(1)).thenReturn(null);。我发布的问题是一个简化。
    • 如果你测试readByUserid 方法,那么你不需要模拟getConnFromPool,因为它没有被调用。
    • 在真正调用它的代码中,我只是没有把它放在问题中。我调整了问题以避免任何混淆。
    • 抱歉,dao.readByUserid 仍然返回 null,可能是 @Stateless 注释造成了问题?
    • 很奇怪,MockitoJUnitRunner 应该忽略这个注解。问题的示例中可能缺少其他内容,因为我已经测试了此代码并且测试工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多