gpt4 book ai didi

java - 在 Guice 中为 Map 注入(inject)编写单元测试

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

我是 Guice 的新手。我编写了以下依赖于通用映射的类,该映射是 managerMap,它将对象类型映射到负责处理该类型对象的特定管理器。

public class MyClass<T extends MyClass> {

@Inject
@Named("ManagerMap")
private Map<String, Manager> managerMap;

@Override
public void myFunc(@NotNull T myObj) {
Manager manager = managerMap.get(myObj.getClass().getName());
manager.call(myObj);
}
}

以上代码运行良好。现在我想为上面编写单元测试。我写的如下,它正在工作,但我认为有更好的方法来做到这一点。

@RunWith(MockitoJUnitRunner.class)
public class MyClassTest {

@InjectMocks
private MyClass myclass;

@Mock
private Map<String, Manager> managerMap;

private final MyClass1 myObj; <--MyClass1 extends from MyClass

@Test
public void testmyFunc() {
Mockito.when(managerMap.get(myObj.getClass().getName())).thenReturn(new MyManager1());
myclass.myFunc(myObj);
}
}

最佳答案

做事的“最佳”方式是个人喜好问题,所以对 SO 来说这不是一个好问题。

但这就是我编写代码的方式:

public class MyClass<T extends MyClass> {

private final Map<String, Manager> managerMap;

@Inject // constructor injection
@Named("ManagerMap")
public class Myclass(Map<String, Manager> managerMap) {
this.managerMap = managerMap;
}

@Override
public void myFunc(@NotNull T myObj) {
Manager manager = managerMap.get(myObj.getClass().getName());
manager.call(myObj);
}
}

测试

public class MyClassTest {

private MyClass myclass;

@Test
public void testmyFunc() {
// prepare map
Map<String, Manager> managerMap = new HashMap();
MyManager1 = myManager new MyManager1()
managerMap.put(myObj.getClass.getName(), myManager);

// create class under test with injected map
myclass = new MyClass(managerMap);

myclass.myFunc(myManager);
}
}

所以通过使用Constructor注入(inject)和一个普通的HashMap,测试代码变得干净多了,被测类也差不了多少。这里不需要 Mockito。

如果您确实想传递 Manager Mock,您可能需要 Powermock,例如 this question模拟 getClass() 调用。

关于java - 在 Guice 中为 Map 注入(inject)编写单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48251225/

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