Mockito:模拟注入的新生成对象的成员

时间:2017-01-13 21:22:04

标签: java unit-testing junit mockito

我想测试以下课程:

public class ClassToTest {
    private List<Bar> bars = new LinkedList<>();

    public makeBarsFromIDs(List<Integer> idList) {
        for (Integer id : idList) {
            Bar bar = new Bar();
            bar.setID(id);
            bars.add(bar);
        }
    }

    public List<String> getFooStringsFromBars() {
        List<String> fooStrings = new LinkedList();
        for (Bar bar : this.bars)
            fooStrings.add(bar.getFooListAsString());
        return fooStrings;
    }
}

在addToBarList中,实例化Bar对象。

public class Bar {
    private int myID;

    @Inject
    private FooRepository fooRepository;

    public setID(int ID) {
        myID = ID;
    }

    public String getFooListAsString() {
        return fooRepository.findByID(myID).toString();
    }
}

Bar使用FooRepository,我想模仿。如果我测试Bar,这可以正常工作,但我如何测试ClassToTest并仍然模拟FooRepository

我不能只是模拟Bar,因为会创建具有不同值的多个实例。我需要测试它们是否正确创建。

1 个答案:

答案 0 :(得分:0)

如果您正在测试FooRepository,则不必模拟ClassToTest,因为它将作为此课程的黑盒子。你要做的只是模仿Bar并写下测试。

但在此之前,您必须开始在Bar注入ClassToTest作为依赖性,就像FooRepository BarBar的情况一样Bar bar = new Bar(); 1}}。

这是因为如果你的方法中有以下语句,那么将为ClassToTest创建一个新的onject,并且你无法用你的模拟替换它。

public class ClassToTest {

    @Inject
    private Bar bar;

    public addToBarList(barID) {
        bar.setID(fooID);

        List<Foo> fooList = bar.getFooList();
        ...
    }
}

进行相关更改后,您的public class SomeTest { @Mock private Bar bar; @InjectMocks private ClassToTest testClass; @Before public void init() { Mockito.initMocks(this); } @Test public void testAdd() { Mockito.when(bar.getFooList()).thenReturn(Arrays.asList(new Foo())); testClass.addToBarList(...); } } 应如下所示:

{{1}}

您的测试类应如下所示:

{{1}}