3 回答
TA贡献1829条经验 获得超4个赞
在您的情况下,您应该写:
TestedClass tc = spy(new TestedClass());
LoginContext lcMock = mock(LoginContext.class);
when(tc.login(anyString(), anyString())).thenReturn(lcMock);
TA贡献1811条经验 获得超6个赞
例如,如果该login方法有点“骗子”:
public class TestedClass {
public LoginContext login(String user, String password) {
LoginContext lc = new LoginContext("login", callbackHandler);
lc.doThis();
lc.doThat();
}
}
...这是旧代码,无法重构以提取新的初始化LoginContext为其自己的方法并应用上述解决方案之一。
为了完整起见,值得一提的是第三种技术- 在调用运算符时使用PowerMock注入模拟对象new。但是,PowerMock并不是灵丹妙药。它通过在其模拟的类上应用字节码操作来工作,如果所测试的类采用字节码操作或反射,并且至少从我的个人经验出发,已知该类会给测试带来性能损失,那么这可能是狡猾的实践。再说一次,如果没有其他选择,则唯一的选择必须是好的选择:
@RunWith(PowerMockRunner.class)
@PrepareForTest(TestedClass.class)
public class TestedClassTest {
@Test
public void testLogin() {
LoginContext lcMock = mock(LoginContext.class);
whenNew(LoginContext.class).withArguments(anyString(), anyString()).thenReturn(lcMock);
TestedClass tc = new TestedClass();
tc.login ("something", "something else");
// test the login's logic
}
}
TA贡献1840条经验 获得超5个赞
您可以使用工厂来创建登录上下文。然后,您可以模拟工厂并返回您想要进行测试的任何内容。
public class TestedClass {
private final LoginContextFactory loginContextFactory;
public TestedClass(final LoginContextFactory loginContextFactory) {
this.loginContextFactory = loginContextFactory;
}
public LoginContext login(String user, String password) {
LoginContext lc = loginContextFactory.createLoginContext();
}
}
public interface LoginContextFactory {
public LoginContext createLoginContext();
}
添加回答
举报