java - 测试私有(private)静态方法

标签 java unit-testing mocking static-methods jmockit

您好,我想测试generateKey方法和调度程序正在调度的消息。我尝试模拟该类和公共(public)方法 verifyOtherDetails()。在其中,我创建了一个期望,即调度程序方法具有文字值,但它总是会通过。任何帮助将不胜感激。

请参阅底部我尝试的代码,谢谢。

abstract class KeyGen {

  private static void generateKey(String key, String username){
    if(Strings.isNullOrEmpty(key)){
      Dispatcher.dispatch(new WarningString(String.format("The key is null or empty for user %s", username)));
    }else{
      Dispatcher.dispatch(new InfoString(String.format("The key is correct for user %s", username)));
    }
  }

  public void verifyOtherDetails(String address, Map<String, String> favouriteFilms){
    String key ="";
    String username ="";
    generateKey(key, username);
  }
}

public class TestKeyGen {

  @Test
  public void testKey() {
    new MockUp<KeyGen>() {
      @Mock()
      public void verifyOtherDetails() {

        String key = "sfjhlkjhfkjdhlsk";
        final String username = "Daniel";
        new Expectations() {
          {
            Dispatcher.dispatch(new WarningString(String.format("The key is null or empty for user %s", username)));
          }
        };
      }
    };
  }
}

最佳答案

鉴于您的设计,我想说很难测试您的方法。基本上这是因为您使用的是调度程序类的静态方法,因此您无法轻松模拟它。

不过你有很多选择。您可以在测试中订阅调度程序消息并检查预期消息是否到达。这是侵入性最小的,可用作集成测试。

另一种选择是将调度程序静态调用包装在接口(interface)中,并将该接口(interface)的模拟注入(inject)到 KeyGen 类中,然后通过公共(public)方法测试接口(interface)上的方法是否被调用。

public interface DispatchWrapper{
    void dispatch(IString stringToDispatch);
}

public class StaticDispatcher : DispatchWrapper{
    void dispatch(IString stringToDispatch)
    {
            Dispatcher.dispatch(stringToDispatch);
    }
}

abstract class KeyGen {
  private DispatchWrapper wrapper;

  public KeyGen(DispatchWrapper wrapper){
      this.wrapper = wrapper;
  }
  private static void generateKey(String key, String username){
    if(Strings.isNullOrEmpty(key)){
      wrapper.dispatch(new WarningString(String.format("The key is null or empty for user %s", username)));
    }else{
      wrapper.dispatch(new InfoString(String.format("The key is correct for user %s", username)));
    }
  }

  public void verifyOtherDetails(String address, Map<String, String> favouriteFilms){
    String key ="";
    String username ="";
    generateKey(key, username);
  }
}

第三个选项是将私有(private)方法移动到不同的静态类并将其公开,然后您可以测试该类(与静态调度程序存在相同的问题)。然后您的 KeyGen 类可以成为一个 VerifyingKeyGen ,它只是验证然后委托(delegate)给其他方法来实际生成 key 。这很好地区分了您所关心的两个问题,即生成新 key 和验证详细信息

public static class KeyGen {

  public static void generateKey(String key, String username){
    if(Strings.isNullOrEmpty(key)){
      Dispatcher.dispatch(new WarningString(String.format("The key is null or empty for user %s", username)));
    }else{
      Dispatcher.dispatch(new InfoString(String.format("The key is correct for user %s", username)));
    }
  }

abstract class VerifyingKeyGen{

  public void verifyOtherDetails(String address, Map<String, String> favouriteFilms){
    String key ="";
    String username ="";
    KeyGen.generateKey(key, username);
  }
}

关于java - 测试私有(private)静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26678518/

相关文章:

unit-testing - 使用 Groovy MetaClass 覆盖方法

unit-testing - 模拟 Microsoft Application Insights API

c# - 使带有内部修饰符的测试类对单元测试框架可见

ruby-on-rails - 使用 Factory_girl 建立测试中关联

unit-testing - 单元测试复合函数

java - 创建新的 Spring 注释

java - 使用 soapUI API 创建 soapUI Mock 对象

java - 如何从 Java EE Web 应用程序运行外部应用程序?

java - 如何计算字符串中字母文字的数量?

java - JSP+JDBC问题