gpt4 book ai didi

java - 使用 Mockitos 进行单元测试未按预期工作

转载 作者:行者123 更新时间:2023-12-01 11:10:02 24 4
gpt4 key购买 nike

我是 Mockito 的新手,我想为一些遗留代码编写单元测试。在测试我的特定场景时,我确实尝试了一些提到的使用mockito的技术,但我无法找到适合我的用例的解决方案。这是我的场景:

我有一个方法A(对数据进行本地处理)和一个方法B(对数据进行一些远程处理)。方法 A 依次调用我的方法 B。我想调用方法 A,当它依次调用方法 B 时,我想从方法 B 返回一个预定义值,比如说文件列表。以下是测试类和实际类的示例代码:

Myclass mc = Mockito.mock(MyClass.class);
when(mc.methodB(param1,param2)).thenReturn(fileSet); // returns mocked fileSet (set of files)
when(mc.methodA(param1,param2)).thenCallRealMethod(); //calls real method A
mc.methodA(param1,param2); //does not return the mocked value from methodB

class MyClass{
public Set<File> methodB(param1,param2){
//some processing
return fileSet;
}

public void methodA(param1,param2){
//some processing
Set<FileSet> fileSet = methodB(param1,param2);
//some more processing on returned files
}

}

我创建了类的模拟,并确保当我调用方法 A 时,会发生方法 A 的真实方法调用,而当我调用方法 B 时,会返回模拟结果。

如果我分别测试方法 A 和方法 B,它可以工作,但是当我调用方法 A 进而调用方法 B 时,它不会从方法 B 返回我的模拟值。

这不是进行此通话的正确方法还是我遗漏了什么?

最佳答案

如果我理解正确的话,您想要模拟类中的一个方法,同时真正调用同一类中的另一个方法。

这可以使用 spies 来完成:对于 spy ,对象中的每个方法都会被真正调用,除非它被明确地 stub :

MyClass myClass = new MyClass();
MyClass spy = spy(myClass); // creates a spy for myClass
doReturn(new HashSet<File>() {{ add(new File("file1")); }}).when(spy).methodB("", ""); // stubbing method B
spy.methodA(param1, param2); // calling the real method A

请注意,应谨慎使用 spy ,仅用于处理无法更改的遗留代码。

请注意, stub methodB 的构造与“通常”的构造不同。如果我们编写以下代码:

when(spy.methodB("", "")).thenReturn(...);

发生的事情是真正的methodB在这里被实际调用,这是我们不想要的。在第二个构造中:

doReturn(...).when(spy).methodB("", "");

未调用methodB

这是一个演示 spy 的完整测试类:

import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.when;

import java.io.File;
import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

public class TestClass {

@Test
public void test() {
MyClass myClass = new MyClass();
MyClass spy = spy(myClass); // creates a spy for myClass
doReturn(new HashSet<File>() {{ add(new File("file1")); }}).when(spy).methodB("", ""); // stubbing method B
spy.methodA("", ""); // calling the real method A
}

}

class MyClass {

public Set<File> methodB(String param1, String param2) {
return new HashSet<File>() {{ add(new File("file2")); }};
}

public void methodA(String param1, String param2) {
Set<File> fileSet = methodB(param1, param2);
System.out.println(fileSet); // prints [file1] and not [file2], meaning the stubbed method was called and not the real one
}

}

关于java - 使用 Mockitos 进行单元测试未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32488054/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com