Mockito模拟方法返回NULL

时间:2018-03-27 19:16:38

标签: java testing junit mockito

我正在使用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为空“);”

2 个答案:

答案 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 frameworkmember.createNewId(),您现在可以真正调用生产代码。

答案 1 :(得分:1)

您正在创建两个MemberDao实例。首先,MockitoJUnitRunner创建一个实例,将其分配给字段memberDao并将该实例注入到Member对象中。然后在方法setUp中创建DAO的新实例并将其分配给字段memberDao。因此,字段memberDao不再与会员的DAO相同。在字段上定义行为时,Member对象仍在使用没有定义行为的第一个DAO。因此,memberDao.findNext()中的Member#createNewId会返回null

幸运的是,解决方案非常简单:删除测试中的setUp方法。