gpt4 book ai didi

java - Mockito - 与模拟零交互 - Singleton

转载 作者:行者123 更新时间:2023-12-01 09:07:23 24 4
gpt4 key购买 nike

先决条件

我有以下类(class)(虚构,只是为了演示问题):

public class MySingleton {

private static MySingleton sMySingleton;
private static List<String> sItemList;

private MySingleton(List<String> list) {
sItemList = list;
}

public static MySingleton getInstance(List<String> list) {
if (sMySingleton == null) {
sMySingleton = new MySingleton(list);
}
return sMySingleton;
}

public void addItem(String item) {
sItemList.add(item);
}

public void removeItem(String item) {
sItemList.remove(item);
}
}

以及相应的测试类:

public class MySingletonTest {

private MySingleton mInstance;
private List<String> mList;

@Before
public void setup() {
mList = mock(List.class);
mInstance = MySingleton.getInstance(mList);
}

@Test
public void testAddItem() throws Exception {
String item = "Add";
mInstance.addItem(item);
verify(mList, times(1)).add(item);
}

@Test
public void testRemoveItem() throws Exception {
String item = "Remove";
mInstance.removeItem(item);
verify(mList, times(1)).remove(item);
}
}
<小时/>

问题

如果我现在执行完整的测试类,Mockito 会告诉我测试 testRemoveItem() 与模拟的交互次数为 0。

这怎么可能?

<小时/>

注意:
请不要开始讨论感知单例。这个问题是关于 Mockito 以及为什么它不起作用。

最佳答案

JUnit 为每个测试创建一个新的测试类实例,Mockito 为每个测试填充一个新的模拟实例。但是,您的单例只会初始化一次,这意味着在第一次测试期间 mList == MySingleton.sItemList 但在之后的每次测试中 mList != MySingleton.sItemList

换句话说,交互正在发生,但通过第二次测试,您检查了错误的模拟。

虽然我知道您不是来讨论这种类型的单例的优点,但请记住,如果您这样做,您可能会很难在测试中替换实例。相反,请考虑使单例的构造函数(仅)可供您的测试使用,并将 List (或其他状态)保留在实例内。这样您就可以为每个单独的测试创建一个全新的“单例”。

关于java - Mockito - 与模拟零交互 - Singleton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41157839/

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