我正在使用Mockito,并试图模拟下面的测试类。 这里的主类方法createNewId()通过命中dao类'memberDao.findNext()'来获取对象。 我试图模拟'memberDao.findNext()'并返回对象,如下面的代码所示,但它返回为NULL。
还有如何为void方法编写Test,即“memberDao.delete(newId.getId());” 需要在此行之后执行此操作“when(memberDao.findNext())。thenReturn(id);”
请让我知道我做错了什么。
@RunWith(MockitoJUnitRunner.class)
public class MemberTest
{
@InjectMocks
private Member member;
@Mock
private MemberDao memberDao;
@Test
public void createId() throws Exception
{
MembersIdDto id = new MembersIdDto();
id.setId("967405286");
when(memberDao.findNext()).thenReturn(id);
verify(member).createNewId().contains("967405286");
}
public class Member {
@Resource
MemberDao memberDao;
public String createNewId()
{
MembersIdDto newId = memberDao.findNext();
Assert.notNull(newId, "newId is empty");
String id = newId.getId();
memberDao.delete(newId.getId());
return id;
}
}
memberDao.findNext()是我试图模拟的行。
错误是: java.lang.IllegalArgumentException:newId为空
at org.springframework.util.Assert.notNull(Assert.java:134)
at Member.createNewId() (Member.java:20)
//第20行是“Assert.notNull(newId,”newId为空“);”
答案 0 :(得分:2)
您的要求的工作示例可能是:
@RunWith(MockitoJUnitRunner.class)
public class MemberTest {
@InjectMocks
private Member member;
@Mock
private MemberDao memberDao;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void createId() throws Exception {
MembersIdDto dto = new MembersIdDto();
dto.setId("967405286");
when(memberDao.findNext()).thenReturn(dto);
assertThat(member.createNewId()).isEqualTo("967405286");
}
}
...与被测试的课程......
public class Member {
@Resource
MemberDao memberDao;
public String createNewId() {
return memberDao.findNext().getId();
}
}
...和...
public class MemberDao {
public MembersIdDto findNext() {
return null; // or whatever
}
}
...和...
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class MembersIdDto {
private String id;
}
顺便说一下,我使用AssertJ assertion framework和member.createNewId()
,您现在可以真正调用生产代码。
答案 1 :(得分:1)
您正在创建两个MemberDao实例。首先,MockitoJUnitRunner创建一个实例,将其分配给字段memberDao
并将该实例注入到Member对象中。然后在方法setUp
中创建DAO的新实例并将其分配给字段memberDao
。因此,字段memberDao
不再与会员的DAO相同。在字段上定义行为时,Member对象仍在使用没有定义行为的第一个DAO。因此,memberDao.findNext()
中的Member#createNewId
会返回null
。
幸运的是,解决方案非常简单:删除测试中的setUp
方法。