如何为方法参数中具有私有枚举的方法编写 JUnit 测试用例



>我有一个 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(...);
  }
}

相关内容

  • 没有找到相关文章

最新更新