Mockito 的 doReturn() 方法未在代码中返回所需的值
doReturn() method of Mockito is not returning desired value in code
我正在尝试对以下方法进行单元测试:
Class TestClass {
public List<String> test(String a, String b, String c, String d) throws IOException {
MyClass myClass = new MyClass();
myClass.setFileName(functionName);
int outputNum = myClass.getOutputTableArgsSize();
List<String> list = new ArrayList<String> ();
... and some more code based on outputNum value.
return list;
}
}
我的单元测试方法如下所示:
@Test
public void testMyTestClass() throws Exception {
TestClass myClass = new TestClass();
MyClass myClass = mock(MyClass.class);
doNothing().when(myClass).setFileName(anyString());
doReturn(11).when(myClass).getOutputTableArgsSize();
.... Some more lines and based on return value 11, I am expecting the size of the list to be return is 1.
assertEquals(TestClass.test("ab", "cd", "ef", "gh").size(), 1);
}
我正在尝试 return 11 行
doReturn(11).when(myClass).getOutputTableArgsSize(); 但当我检查时 return 值始终为 0.
上面的单元测试有什么问题,为什么我总是在 doReturn() 中得到 0 insted 值?
测试中的mock
MyClass myClass = mock(MyClass.class);
不是被测方法中使用的实例,因为被测方法创建了自己的实例。
public List<String> test(String a, String b, String c, String d) throws IOException {
MyClass myClass = new MyClass();
//...
被测方法与实现问题紧密耦合,这使得单独测试它变得困难。
考虑重构正在测试的主题 class 以通过构造函数注入明确依赖于 class。
如果每次调用都需要一个新实例,那么请考虑使用工厂
public interface MyClassFactory {
public MyClass Create(string functionName);
}
public class MyClassFactoryImp implements MyClassFactory {
public MyClass Create(string functionName) {
MyClass myClass = new MyClass();
myClass.setFileName(functionName);
return myClass
}
}
并相应地重构主题 class
class TestClass {
MyClassFactory factory;
public TestClass(MyClassFactory factory) {
this.factory = factory;
}
public List<String> test(String a, String b, String c, String d) throws IOException {
MyClass myClass = factory.Create(functionName);
int outputNum = myClass.getOutputTableArgsSize();
List<String> list = new ArrayList<String> ();
//... and some more code based on outputNum value.
return list;
}
}
以便可以构建和执行适当的隔离测试
@Test
public void testMyTestClass() throws Exception {
//Arrange
MyClass myClass = mock(MyClass.class);
doNothing().when(myClass).setFileName(anyString());
doReturn(11).when(myClass).getOutputTableArgsSize();
MyClassFactory factory = mock(MyClassFactory.class);
doReturn(myClass).when(factory).Create(anyString());
TestClass subject = new TestClass(factory);
//Act
List<String> result = subject.test("ab", "cd", "ef", "gh");
//Assert
assertEquals(result.size(), 1);
}
我正在尝试对以下方法进行单元测试:
Class TestClass {
public List<String> test(String a, String b, String c, String d) throws IOException {
MyClass myClass = new MyClass();
myClass.setFileName(functionName);
int outputNum = myClass.getOutputTableArgsSize();
List<String> list = new ArrayList<String> ();
... and some more code based on outputNum value.
return list;
}
}
我的单元测试方法如下所示:
@Test
public void testMyTestClass() throws Exception {
TestClass myClass = new TestClass();
MyClass myClass = mock(MyClass.class);
doNothing().when(myClass).setFileName(anyString());
doReturn(11).when(myClass).getOutputTableArgsSize();
.... Some more lines and based on return value 11, I am expecting the size of the list to be return is 1.
assertEquals(TestClass.test("ab", "cd", "ef", "gh").size(), 1);
}
我正在尝试 return 11 行 doReturn(11).when(myClass).getOutputTableArgsSize(); 但当我检查时 return 值始终为 0.
上面的单元测试有什么问题,为什么我总是在 doReturn() 中得到 0 insted 值?
测试中的mock
MyClass myClass = mock(MyClass.class);
不是被测方法中使用的实例,因为被测方法创建了自己的实例。
public List<String> test(String a, String b, String c, String d) throws IOException {
MyClass myClass = new MyClass();
//...
被测方法与实现问题紧密耦合,这使得单独测试它变得困难。
考虑重构正在测试的主题 class 以通过构造函数注入明确依赖于 class。
如果每次调用都需要一个新实例,那么请考虑使用工厂
public interface MyClassFactory {
public MyClass Create(string functionName);
}
public class MyClassFactoryImp implements MyClassFactory {
public MyClass Create(string functionName) {
MyClass myClass = new MyClass();
myClass.setFileName(functionName);
return myClass
}
}
并相应地重构主题 class
class TestClass {
MyClassFactory factory;
public TestClass(MyClassFactory factory) {
this.factory = factory;
}
public List<String> test(String a, String b, String c, String d) throws IOException {
MyClass myClass = factory.Create(functionName);
int outputNum = myClass.getOutputTableArgsSize();
List<String> list = new ArrayList<String> ();
//... and some more code based on outputNum value.
return list;
}
}
以便可以构建和执行适当的隔离测试
@Test
public void testMyTestClass() throws Exception {
//Arrange
MyClass myClass = mock(MyClass.class);
doNothing().when(myClass).setFileName(anyString());
doReturn(11).when(myClass).getOutputTableArgsSize();
MyClassFactory factory = mock(MyClassFactory.class);
doReturn(myClass).when(factory).Create(anyString());
TestClass subject = new TestClass(factory);
//Act
List<String> result = subject.test("ab", "cd", "ef", "gh");
//Assert
assertEquals(result.size(), 1);
}