【问题标题】:Cannot subclass final class with PowerMockRule无法使用 PowerMockRule 子类化最终类
【发布时间】:2016-07-16 01:41:34
【问题描述】:

我正在使用 JUNIT 与 Powermockito 和 EclEmma 来测试我的代码。现在有一个问题。我必须测试这个类:

public class Main
{
    private static final Logger slf4jLogger = LoggerFactory.getLogger(Main.class);
    private static final Marker marker      = MarkerFactory.getMarker("Test");

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println(slf4jLogger);
        slf4jLogger.debug(marker, "Hallo");
        slf4jLogger.trace(marker, "Hallo");
        slf4jLogger.info(marker, "Hallo");
        slf4jLogger.warn(marker, "Hallo");
        slf4jLogger.error(marker, "Hallo");
    }

}

这是我的测试:

@PrepareForTest({ LoggerFactory.class, Main.class })
public class MainTest
{
    @Rule
    public PowerMockRule            rule        = new PowerMockRule();

    @Rule
    public ExpectedException    thrown  = ExpectedException.none();

    /**
     * Test static Fields
     * 
     * @throws Exception
     */
    @Test
    public void testMain() throws Exception
    {
        Logger logger = PowerMockito.mock(Logger.class);

        PowerMockito.mockStatic(LoggerFactory.class);
        PowerMockito.when(LoggerFactory.getLogger(Mockito.any(Class.class))).thenReturn(logger);

        Main.main(null);

        Mockito.verify(logger).debug(Mockito.any(Marker.class), Mockito.eq("Hallo"));
        Mockito.verify(logger).trace(Mockito.any(Marker.class), Mockito.eq("Hallo"));
        Mockito.verify(logger).info(Mockito.any(Marker.class), Mockito.eq("Hallo"));
        Mockito.verify(logger).warn(Mockito.any(Marker.class), Mockito.eq("Hallo"));
        Mockito.verify(logger).error(Mockito.any(Marker.class), Mockito.eq("Hallo"));
    }

}

但是有如下错误:

java.lang.IllegalArgumentException:不能子类化最终类类 org.slf4j.LoggerFactory 在 org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447) 在 org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25) 在 org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217) 在 org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378) 在 org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318) 在 org.powermock.api.mockito.repackaged.ClassImposterizer.createProxyClass(ClassImposterizer.java:123) 在 org.powermock.api.mockito.repackaged.ClassImposterizer.imposterise(ClassImposterizer.java:57) 在 org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:111) 在 org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:59) 在 org.powermock.api.mockito.PowerMockito.mockStatic(PowerMockito.java:70) ...

我不想使用 powermock-module-javaagent。有没有办法做到这一点?

【问题讨论】:

    标签: java mockito powermock powermockito eclemma


    【解决方案1】:

    一种选择是为slf4jLogger 创建一个静态getter 方法,然后重构您的main 方法来调用这个新方法。然后你可以在你的测试中存根这个方法:

    PowerMockito.spy(Main.class);
    PowerMockito.when(Main.getSlf4jlogger()).thenReturn(logger);
    

    (而不是

    PowerMockito.mockStatic(LoggerFactory.class);
    PowerMockito.when(LoggerFactory.getLogger(Mockito.any(Class.class))).thenReturn(logger);
    

    )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-09
      • 2017-01-03
      • 2014-11-09
      • 2019-05-15
      • 2018-03-24
      • 2019-01-31
      相关资源
      最近更新 更多