我有一个这个班级
public class AuthenticationModule {
String userName = "foo";
String password = "bar";
public void setUserName(String userName) {
this.userName = userName;
}
public void setPassword(String password ) {
this.password = password ;
}
AuthenticationServicePort authenticationServicePort;
AuthenticationService port;
private boolean authenicate(String userName, String password) {
authenticationServicePort = new AuthenticationServicePort();
port = authenticationServicePort.getAuthenticationServiceProxy();
return port.login(userName, password);
}
public boolean validateUser() {
return authenicate(userName, password);
}
}
和AuthenticationServicePort
返回一个WSDL端口
我想用模拟AuthenticationServicePort
创建一个简单的测试用例,它会返回一个' true / false'价值
如何在不更改java代码的情况下注入我自己的MockObject
?
或者更糟糕的情况是,更容易测试的最简单方法是什么。
答案 0 :(得分:1)
您应该避免创建具有任何逻辑的类的实例(不是普通的DTO对象)。相反,您应该以这样的方式设计您的类,即依赖注入容器可以构建完整的对象图。如果authenicate
方法的每次调用都需要AuthenticationServicePort
的新实例,那么在您的代码中,您需要自己回答?如果是,则应使用factory模式创建此对象的实例,并且应注入此工厂(在构造函数中提供),以便您可以模拟它以及它将生成的所有内容。如果authenticate
方法的多次调用可以重用AuthenticationServicePort
的同一个实例,那么只需注入它(在构造函数中提供)并在测试中提供mock而不是实际实现。
答案 1 :(得分:0)
以下是使用JMockit 1.13模拟AuthenticationServicePort
的示例测试:
public class AuthenticationModuleTest
{
@Tested AuthenticationModule authentication;
@Mocked AuthenticationServicePort authenticationService;
@Mocked AuthenticationService port;
@Test
public void validateUser()
{
final String userName = "tester";
final String password = "12345";
authentication.setUserName(userName);
authentication.setPassword(password);
new Expectations() {{ port.login(userName, password); result = true; }};
boolean validated = authentication.validateUser();
assertTrue(validated);
}
}