代码之家  ›  专栏  ›  技术社区  ›  Joy

在Guice中编写Map注入的单元测试

  •  3
  • Joy  · 技术社区  · 7 年前

    我是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);
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   tkruse    7 年前

    哪种“最好”的做事方式是品味的问题,所以这不是一个好问题。

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

    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);
        }
    }
    

    因此,通过使用构造函数注入和一个普通的HashMap,测试代码变得更干净,被测试的类也不会更差。这里不需要Mockito。

    如果您确实想通过Manager Mock,您可能需要Powermock,例如 this question 嘲笑 getClass() 呼叫