>我有一个 Spring 控制器类,它定义了接受私有枚举的方法,如下所示。我们如何使用 Junit/Mockito 为此编写测试用例?
@RequestMapping("/getData")
public String getData(
@RequestParam(value = "someFilter") SomeFilter someFilter)
{
// do something
}
在上面的代码中,SomeFilter 是一个枚举,它被定义为一个私有的内部类。
为上述方法编写测试用例时,由于枚举不可见,我无法调用该方法,我尝试使用 Mockito.any((,但仍然没有用。
我们有什么方法可以测试上述方法吗?
因此,如果该方法将在 spring 调用,那么您将不得不找出、如何并复制它。但老实说,它仍然闻起来像非常糟糕的代码,一种实际上不是公开的公共方法......
无论如何,你当然可以通过一些反射魔法来测试它......让我们假设这个简单的类...
public class Testy {
private enum TestyEnum {
X,
y;
}
public String someMethod(final TestyEnum testyEnum) {
return testyEnum.name();
}
}
因此,我们有一个私有枚举和一个接受它作为参数的公共方法。要调用它,我们必须使用反射...
public class TestyTest {
private final Testy toTest = new Testy();
@Test
public void someMethod_should_return_correct_name_of_x() throws Exception {
// Get the class object for our private enum
final Class<?> testyEnumClass = Class.forName( "de.assona.iframe.view.Testy$TestyEnum" );
// List the enum constants
final Object[] consts = testyEnumClass.getEnumConstants();
// Get the method via reflection per name and argument type
final Method method = Testy.class.getMethod( "someMethod", testyEnumClass );
// call (invoke) it...
final Object o = method.invoke( this.toTest, consts[0] );
// And check that the object returned is actually the correct String we expect the name of the private enum constant)
Assert.assertEquals( "X", o );
}
}
但是,当然,这是一个可怕的解决方法,不好阅读,维护不好,并且是您不应该拥有的问题的解决方案。Spring不需要你生成糟糕的代码,相反,它解决了许多导致错误代码的问题。因此,我真的建议您尝试重构该代码,使其以清晰,易于维护的方式进行测试。相信我,你(和你的代码同事(不会很高兴你找到了测试坏代码的方法,因为这会让你保留坏代码。经过测试的坏代码比未经测试的坏代码要好,但仍然是坏的。从长远来看,你(和你的代码同事(会更快乐地使用好的代码,因为它使一切变得如此容易......
您可以使用Spring MockMvc测试代码,而不是调用控制器对象的方法。
public class ControllerTest {
private final YourController controller = ...
private final MockMvc mockMvc = MockMvcBuilders.standaloneSetup(controller)
.build();
@Test
public void someTest() throws Exception {
mockMvc.perform(get("/getData").param("someFilter", "THE_NAME_OF_THE_FILTER"))
.andExpect(status().isOk())
.andExpect(content().mimeType("text/html"))
.andExpect(...);
}
}