2014-10-31 22 views
1

嗨我想测试的分配器调度的generateKey方法和消息。我试图嘲笑类和公共方法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))); 
      } 
     }; 
     } 
    }; 
    } 
} 
+2

在测试私有方法方面已经有很多材料 - 包括[其他答案在SO](http://stackoverflow.com/questions/34571),包括如果你谷歌的顶部命中[文本这个问题的主题行](https:// www .google.com/webhp?离子= 1#Q =测试%20A%20private%20Static%20method)。那些回答你的问题吗? – yshavit 2014-10-31 15:52:57

+0

我已经看到了使用反射,但我想看看是否有更清晰的方法来验证方法。我是JMockit的新手,对嘲笑对象没有太多经验。 – 2014-10-31 16:00:29

回答

2

鉴于你的设计,我会说它很难测试你的方法。基本上这是因为你使用调度类的静态方法,所以你不能轻易地嘲笑它。

虽然你有一个选择的轿跑车。您可以订阅测试中的调度程序消息并检查预期的消息是否到达。这是最不具有侵入性的,并且可用作综合测试。

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

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

第三个选项是私有方法移动到不同的静态类,并把它公开,那么你可以测试类(与你的静态调度员同样的问题)。然后你的KeyGen类可以成为一个VerifyingKeyGen它只是验证然后委托给其他方法来实际生成密钥。这很好地分离的2个担忧,你有,即产生新的密钥和验证deatils

的问题测试
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); 
    } 
} 
+0

你能否指点我一个例子的方向。我明白你的意思,但凭借我的知识,在能够尝试之前需要多读一些。 – 2014-10-31 16:07:05

+0

我不能帮助第一个位(订阅调度程序消息),因为我不知道如何订阅接收消息在您的应用程序/框架。我认为你尽管:)。但我会提供一个包装的例子,给我一点。 – 2014-10-31 16:09:14

+0

优秀的山姆非常感谢 – 2014-10-31 16:28:53

1

修正版本:

@Tested KeyGen keyGen; 
@Mocked Dispatcher dispatcher; 

@Test 
public void testKey() { 
    keyGen.verifyOtherDetails("???", null); 

    final WarningString warning = 
     new WarningString("The key is null or empty for user "); 

    new Verifications() {{ Dispatcher.dispatch(warning); }}; 
} 

(提供WarningString实现equals方法。 )