您好,我想测试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/