我需要模拟常量变量以测试我的方法之一。如何使用Mokito和Junit。
@Component( "mybean" )
@org.springframework.context.annotation.Scope( value="session" )
public class MyBean {
Public void methodToBeTested() {
if (!AppConst.SOME_CONST.equals(obj.getCostCode())) {
// some logic
}
}
}
AppConst类
@Configuration
public class AppConst
{
public static String SOME_CONST;
public static String HOST_URL;
@PostConstruct
public void postConstruct()
{
SOME_CONST = "My Code";
HOST_URL = "Some URL";
}
}
因此,从我的junit测试类中,如何模拟AppConst及其变量?现在,当我运行它时,出现空指针错误。
可以用powermock完成吗?如果是,请给一些样品
我使用的Mockito版本。
compile "org.mockito:mockito-all:1.9.5"
compile "org.powermock:powermock-mockito-release-full:1.6.1"
代替嘲笑,还有另一种解决方案可以对其进行测试:
public void methodToBeTested(SomeObject obj) {
performLogic(AppConst.SOME_CONST, obj);
}
boolean performLogic(String check, SomeObject testObj) {
if (!check.equals(obj.getCostCode())) {
// some logic
return true;
}
return false;
}
这样,您可以测试两件事,两者结合起来可以说明您的代码可以按预期工作:
public void testMethodToBeTested() {
MyBean mb = new MyBean() {
@Override
void performLogic(String check, SomeObject testObj) {
assertSame("check constant is passed", AppConst.SOME_CONST, check);
}
}
mb.methodToBeTested(new SomeObject());
mb = new MyBean();
SomeObject so = createSomeTestObject("My Code"); // not the actual constant but an equal String
assertFalse("check some logic not occurred", mb.performLogic("My Code", so));
so = createSomeTestObject("Not the constant");
assertFalse("check some logic not occurred", mb.performLogic("Not my Code", so));
assertTrue("check some logic occurred", mb.performLogic("My Code", so));
// additional tests covering the actual logic
}
另一种解决方案可以将if语句的条件放入其自己的方法中,例如shouldLogicOccurr(String check)
并分别测试该方法。
换句话说:有时必须重构代码以使测试更容易甚至有时甚至完全可行。一个好的副作用是下次您实施某些已经考虑到可测试性的事情,并首先创建适合于此的代码。
模拟是一种使用第三方库进行测试的好方法,这些库无法更改并且具有过多的依赖关系,因此如果您最终将其用于自己的代码,则会遇到设计问题。