Java 如何使用EasyMock对一个方法进行单元测试,该方法对我想要模拟的类进行多个内部调用
我想使用Java 如何使用EasyMock对一个方法进行单元测试,该方法对我想要模拟的类进行多个内部调用,java,unit-testing,easymock,Java,Unit Testing,Easymock,我想使用EasyMock对一个我想要模拟的类进行多个内部调用的方法进行单元测试 该测试方法实际上运行了5次,并调用mocked方法 在每个循环中,我将创建一些对象,它们都属于同一个类(比如说类A)。 私有方法将调用获取类A实例的mock对象方法,对其求值并返回结果 最后,public方法将返回一个结果列表 我尝试了标准的EasyMock.expect(MockClass.method(A)).andReturn(),但它不起作用,因为类A没有实现equals(): // this is the
EasyMock
对一个我想要模拟的类进行多个内部调用的方法进行单元测试
该测试方法实际上运行了5次,并调用mocked方法
在每个循环中,我将创建一些对象,它们都属于同一个类(比如说类A)。
私有方法将调用获取类A实例的mock对象方法,对其求值并返回结果
最后,public方法将返回一个结果列表
我尝试了标准的EasyMock.expect(MockClass.method(A)).andReturn()
,但它不起作用,因为类A
没有实现equals()
:
// this is the method example I am trying to test
public methodToTest(){
// some logic
privateMethodToTest(x);
// some logic
}
private List<B> privateMethodToTest(int x){
List<B> list = new ArrayList<>();
List<A> all = getObjects(x); //getObjects private method
for (A a:all){
list.add(objectToMock.methodToMock(a));
return list;
}
我不知道怎么做,也找不到任何类似的例子或问题的答案。当单元测试时,我们验证被测代码的公共可观察行为,即返回值和与依赖项的通信
其他的都是我们不测试的实现细节。原因是您可能希望重构代码。这意味着您希望在不改变代码行为的情况下改进代码的结构。您的单元测试将验证您没有意外更改行为。但是,只有在您不必更改它们的情况下,它们才能执行此操作。您需要另一个匹配器。默认情况下,EasyMock将使用
equals
进行匹配。但你不能那样做。你的基本选择是:
expect(objectToMock.methodToMock(anyObject()).andReturn("B object number 1");
expect(objectToMock.methodToMock(anyObject()).andReturn("B object number 2");
expect(mock.methodToTest(EasyMock.cmp(new A(1), Comparator.comparingInt(A::getValue), LogicalOperator.EQUAL))).andReturn(1);
唯一的问题是,您需要一个具有正确值的a
进行比较
expect(mock.methodToTest(cmp(0))).andReturn(3);
public static <T> T cmp(int value) {
reportMatcher(new IArgumentMatcher() {
@Override
public boolean matches(Object argument) {
return value == ((A) argument).getValue();
}
@Override
public void appendTo(StringBuffer buffer) {
buffer.append("A.value=").append(value);
}
});
return null;
}
expect(mock.methodToTest(cmp(0)).andReturn(3);
公共静态T cmp(int值){
reportMatcher(新的IArgumentMatcher(){
@凌驾
公共布尔匹配(对象参数){
返回值==((A)参数).getValue();
}
@凌驾
公共无效附件(StringBuffer缓冲区){
buffer.append(“A.value=”).append(value);
}
});
返回null;
}
在类中添加等于实现在概念上有什么错误吗?似乎是一个最佳实践IMHO。我同意,但是这个类已经给出,并且已经大量使用,更改它将需要很多其他测试,虽然理论上这对其他代码没有影响。如果没有其他选择,我会这样做,但如果可能,我想避免它转到EasyMock文档,并查看章节使用参数匹配器的灵活预期
;您可以根据一些其他属性(假设它有任何属性)匹配类。
expect(mock.methodToTest(cmp(0))).andReturn(3);
public static <T> T cmp(int value) {
reportMatcher(new IArgumentMatcher() {
@Override
public boolean matches(Object argument) {
return value == ((A) argument).getValue();
}
@Override
public void appendTo(StringBuffer buffer) {
buffer.append("A.value=").append(value);
}
});
return null;
}