使用Mockito访问JUnit中测试类中的私有字段

时间:2018-05-07 12:58:19

标签: java junit mockito

我正在测试的课程中我有一个字段,我们称之为private List<Person> people。在测试中,我想验证是否创建了具有某些状态的特定对象。因此,在运行该方法后,我需要访问该列表及其中创建的对象。

我正在使用JUnit和Mockito。

示例测试类:

@RunWith(MockitoJUnitRunner.class)
public class Testclass {

    @InjectMock 
    private TestedClass tested;

    @Mock(name = "personer")
    private List<Person> personerMock;

    @Test
    public void testMethod() throws BaseException {
        PersonA personA = kalle_KMD();
        when(personService.getPerson(any(), any())).thenReturn(Optional.of(personA));
        Properties p = new Properties();
        JobbParametrar params = JobbParametrar.skapa(p);
        batch.uppgift(new PersonIdÄrFöretag(1L, false), params, new KörningsId(1L), user);
        assertEquals(1, personerMock.size());
    }
}

要测试的课程:

public TestedClass {
    private List<Person> persons = Collections.synchronizedList(new ArrayList<Person>());

    public void testedMethod() {
        ...
        PersonA personA = personService.getPerson(identitet, användare);
        Person p = createPerson(personA);
        persons.add(p);
        ...
    }
}

现在,我如何测试创建的对象(Person p)是否已添加到列表中,并访问该对象以查看其值?或者我应该采用完全不同的方法,在这种情况下不使用Mockito? 像在本例中一样,在测试类中模拟实例字段personerMock不起作用。

1 个答案:

答案 0 :(得分:1)

你这样做的方式应该有效,但你需要捕获add的参数。

ArgumentCaptor<Person> captor = ArgumentCaptor.forClass(Person.class);
verify(personerMock).add(captor.capture());
Person createdPerson = captor.getValue();
// verify the values you're expecting in the person