Java Mockito mocked方法返回NULL

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);”之后实现此功能 请让我知道我做错

我正在使用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)
实例化它。因此,在删除手动实例化之后,它就工作了。