【问题标题】:Access private field in tested class in JUnit with Mockito使用 Mockito 访问 JUnit 中测试类中的私有字段
【发布时间】:2018-05-07 12:58:18
【问题描述】:

我正在测试的班级我有一个字段,我们称之为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,就像我在这个例子中所做的那样,在测试类中不起作用。

【问题讨论】:

  • 你可以测试persons多了一个条目和the person p is part of persons and the data from personA

标签: java junit mockito


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-03-07
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多