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();
    }
}

酒吧使用FooRepository,我想嘲笑。如果我测试Bar,这工作正常,但是我如何测试ClassToTest并且仍然模拟FooRepository

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

如果你

正在测试ClassToTest,你真的不必嘲笑FooRepository,因为它将作为这个类的黑盒。您要做的就是模拟Bar并编写测试。

但在此之前,您必须开始将Bar作为依赖项注入ClassToTest,就像您在FooRepository的情况下Bar一样。

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

Bar bar = new Bar();

进行相关更改后,ClassToTest应如下所示:

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(...);
    }
}

相关内容

  • 没有找到相关文章

最新更新