英文:
Mockito always returns null as a result of calling an EJB
问题
我尝试调用该类的第二个方法,但始终返回 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"); // <-- 该方法始终返回 null
assertThat(user).isEqualTo(expectedUser); // <-- 测试失败,因为 expectedUser != null
}
}
另外,请注意 System.out.println
从未打印出。如何修复以实际调用 dao.readByUserid()
?
英文:
I'm trying to call the second method of this class, and always get null
. Note that it returns new User()
however in the test class I always get 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();
}
}
And the test class:
@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
}
}
Also, note that System.out.println
is never printed. How to fix this to actually make a call to dao.readByUserid()
?
答案1
得分: 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
的那一行,因为在使用这种技术时需要这样做。
有关使用 Spy 的详细信息,请参阅文档。
英文:
If you need to test the method of some class, and inside of it the other method of the same class is called which you want to mock, then you need to use @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);
}
}
Note that I slightly modified the line with mocking getConnFromPool
because it's required when you use that technique.
See docs for spying.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论