Java Mockito mocked方法返回NULL
我正在使用Mockito,并尝试模拟下面的测试类。 这里,主类方法createNewId()通过点击dao类“memberDao.findNext()”来获取对象。 我试图模拟“memberDao.findNext()”并返回如下代码所示的对象,但返回为NULL 还有如何为void方法编写测试,即“memberDao.delete(newId.getId());” 需要在这一行“when(memberDao.findNext()).thenReturn(id);”之后实现此功能 请让我知道我做错了什么Java Mockito mocked方法返回NULL,java,testing,junit,mockito,Java,Testing,Junit,Mockito,我正在使用Mockito,并尝试模拟下面的测试类。 这里,主类方法createNewId()通过点击dao类“memberDao.findNext()”来获取对象。 我试图模拟“memberDao.findNext()”并返回如下代码所示的对象,但返回为NULL 还有如何为void方法编写测试,即“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;
}
}
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为空”);”您正在创建两个MemberDao实例。首先,MockitoJUnitRunner创建一个实例,将其分配给字段
memberDao
,并将该实例注入到成员对象中。然后在方法设置中
创建DAO的新实例,并将其分配给字段memberDao
。因此,字段memberDao
不再与成员的DAO相同。当您在字段上定义行为时,成员对象仍在使用未定义行为的第一个DAO。因此Member\createNewId
中的memberDao.findNext()
返回null
幸运的是,解决方案非常简单:删除测试中的
setUp
方法 您的需求的工作示例可以是:
@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;
}
……还有
public class MemberDao {
public MembersIdDto findNext() {
return null; // or whatever
}
}
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
public class MembersIdDto {
private String id;
}
顺便说一句,我使用and和
member.createNewId()
您现在可以真正调用生产代码了。什么类型的manager
?这不是正在测试的课程吗?在您的@Test
方法中,我看不到对生产代码的任何调用。另外请注意,您可以使用@Mock
创建Mock,也可以手动创建Mockito.Mock(MemberDao.class)。两个都做至少是多余的。哦!我的错。我已经更新了代码。。它的成员类而不是main类..酷,我在我的答案中发布了一个相应的工作示例。这个答案对我的帮助更大。在我的例子中,我使用了Spring@MockBean
注释,然后(错误地)用mock(MyClassName.class)
实例化它。因此,在删除手动实例化之后,它就工作了。