2016-04-02 55 views
0

我有一个工具类,这是一个最终的类。在那里我用注射器注射LOGGER。使用Powermock嘲弄静态私有最终变量?

public final class Utilities { 

    @Inject 
    private static Logger.ALogger LOGGER; 

    private Utilities() { 
     //this is the default constructor. so there is no implementation 
    } 

    public static String convertToURl(string input){ 
     try{ 
      //do some job 
      }catch(IllegalArgumentException ex){ 
      LOGGER.error("Invalid Format", ex); 
      } 
    } 

} 

虽然我为这种方法编写单元测试,但我必须模拟LOGGER,否则会抛出空指针异常。我怎样才能嘲笑这个LOGGER而不创建这个类的实例。我试图对变量进行白盒操作。但它只适用于实例?

+0

不[注射到静态字段(http://stackoverflow.com/questions/19225179/is-it-possible-to-inject-a-cdi-bean-into-a-static-variable -in-java-ee-6)为你工作? – fracz

+0

默认情况下,guice不允许通过设计进行静态注入。但我们可以请求[this](http://stackoverflow.com/questions/28513147/guice-injection-in-static-variable) – Burusothman

+0

我不知道。我还没有使用过,但是如果它能够注入静态字段,也许可以用它在单元测试中注入一个记录器模拟? – fracz

回答

1

此代码正常工作。要设置静态字段,您需要将类传递给org.powermock.reflect.Whitebox.setInternalState。请确保您使用包org.powermock.reflect中的PowerMock的课程,因为Mockito的课程名称相同。

@RunWith(PowerMockRunner.class) 
public class UtilitiesTest { 

    @Mock 
    private Logger.ALogger aLogger; 

    @Before 
    public void setUp() throws Exception { 

     MockitoAnnotations.initMocks(this); // for case them used another runner 
     Whitebox.setInternalState(CcpProcessorUtilities.class, "LOGGER", aLogger); 
    } 

    @Test 
    public void testLogger() throws Exception { 
     Utilities.convertToURl(""); 
     verify(aLogger).error(eq("Invalid Format"), any(IllegalArgumentException.class)); 
    } 
} 
+0

它的工作原理。干杯! – Burusothman

+0

它需要更新。白盒不再使用。 – user447607

+0

@ user447607你是什么意思的“不再使用”?该类仍然存在于PowerMock中并将保留。我没有计划将其删除。可能是你的意思是有另一种方式来做到这一点! –