使用Mockito / JUnit模拟Java常量变量(公共静态)

问题描述 投票:0回答:1

我需要模拟常量变量以测试我的方法之一。如何使用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"

java mockito junit4 powermockito
1个回答
0
投票

代替嘲笑,还有另一种解决方案可以对其进行测试:

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)并分别测试该方法。

换句话说:有时必须重构代码以使测试更容易甚至有时甚至完全可行。一个好的副作用是下次您实施某些已经考虑到可测试性的事情,并首先创建适合于此的代码。

模拟是一种使用第三方库进行测试的好方法,这些库无法更改并且具有过多的依赖关系,因此如果您最终将其用于自己的代码,则会遇到设计问题。

© www.soinside.com 2019 - 2024. All rights reserved.