java - 如何模拟由类构建器创建的对象?
问题描述
在我目前的一堂跑步课中,我有:
void run() {
Food food = new FoodBuilder(apple, peach, grape)
.build();
food.eatFood();
我的 FoodBuilder 类是这样的:
public class FoodBuilder implements FoodInterface {
private Food food = new Food();
public FoodBuilder(Apple apple, Peach peach, Grape graph) {
food.add(apple);
food.add(peach);
food.add(graph);
}
@Override
public Food build() {
return food;
}
我的 FoodInterface 是:
public interface FoodInterface {
Food build();
}
现在,我不能改变这个类的结构,但我需要模拟,food
所以我可以在调用时绕过我的服务中的一些权限问题food.eatFood()
,基本上我不想实际调用food.eatFood()
,而是我想模拟food
所以我可以做doNothing().when(food.eatFood())
。
我正在使用 PowerMockito,我的代码是这样的:
@RunWith(PowerMockRunner.class)
@PrepareForTest({FoodBuilder.class})
public class MyTest() {
@Test
public void mytest() {
Food food = Mockito.mock(Food.class);
FoodBuilder builder = Mockito.mock(FoodBuilder.class);
when(builder.build()).thenReturn(food);
doNothing().when(food).eatFood(); // This doesn't work! Because the food object is not a mock, instead it is a real object
}
}
当我运行测试时,该food
对象不是我想要的模拟对象,而是一个正在创建的真实对象,因此我无法food.eatFood()
告诉doNothing()
.
我错过了什么?
解决方案
您可以使用 PowerMockito 的whenNew
功能来拦截构造函数调用。
@Test
public void test() throws Exception {
Food food = Mockito.mock(Food.class);
Mockito.doNothing().when(food).eatFood();
FoodBuilder builder = Mockito.mock(FoodBuilder.class);
Mockito.when(builder.build()).thenReturn(food);
PowerMockito.whenNew(FoodBuilder.class)
.withArguments(any(Apple.class),any(Peach.class),any(Grape.class))
.thenReturn(builder);
run();
}
推荐阅读
- powershell - 有没有办法使用 oauth 令牌连接到 New-CsOnlineSession?
- javascript - 来自 API 的响应返回数据,状态未定义 - React.JS
- c# - ReUp:在 C# 中的表单之间传递多张图片
- csv - 如何在 swagger/yaml 文档上正确记录文本/csv 响应?
- django - 如何使用脚本文件填充 django 数据库?
- javascript - Google-Maps-React:将道具传递给 App.js 的问题
- javascript - Javascript:带有方法的对象与带有开关的函数
- android - 一次添加一个元素时如何在recyclerview中平铺单个元素?
- python - 模拟 Peewe 类不会返回值
- julia - 如何使`eval`使用特定路径来解决Julia中的`include`?