【问题标题】:Cannot subclass final class when using testng使用testng时无法子类化最终类
【发布时间】:2016-03-04 05:08:08
【问题描述】:

在我的项目中,我需要在哪里模拟最终课程。

我正在使用 Test-NG 进行单元测试。

我尝试了不同的方法来模拟,但没有成功。我还检查了不同的堆栈溢出帖子。

运行 testng 测试用例时,我遇到错误 -

java.lang.IllegalArgumentException: Cannot subclass final class class com.AskStateParams
at org.mockito.cglib.proxy.Enhancer.generateClass(Enhancer.java:447)
at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
at org.mockito.cglib.proxy.Enhancer.createHelper(Enhancer.java:378)
at org.mockito.cglib.proxy.Enhancer.createClass(Enhancer.java:318)
at org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:110)
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:62)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.createMethodInvocationControl(MockCreator.java:110)
at org.powermock.api.mockito.internal.mockcreation.MockCreator.mock(MockCreator.java:60)

在 pom.xml 中使用以下依赖项 -

<dependency>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <version>6.8.8</version>
  <optional>true</optional>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-all</artifactId>
  <version>1.9.5</version>
  <scope>test</scope>
</dependency>
<dependency>
  <groupId>org.powermock</groupId>
  <artifactId>powermock-mockito-release-full</artifactId>
  <version>1.5.1</version>
  <classifier>full</classifier>
</dependency>

TestNG 代码如下 -

@RunWith(PowerMockRunner.class)
@PrepareForTest(AskStateParams.class)
public class TestProcessor17100AAskAmount extends AbstractPowerMockProcessorTest {
  @Test
  public void test() {
    AskStateRequestParams  askParams=PowerMockito.mock(AskStateRequestParams.class);

    PowerMockito.when(askParams.getCallerInput()).thenReturn("1000");
    PowerMockito.when(askParams.getResultCode()).thenReturn("Y");
    PowerMockito.when(askParams.getMiString()).thenReturn("P=B");

    Assert.assertEquals(baseProcessor.postProcess(requestContext), "amount");
  }
}

【问题讨论】:

  • 什么是 AbstractPowerMockProcessorTest ?你能分享一下吗?你读过github.com/jayway/powermock/wiki/TestNG_usage 吗?我认为缺少对象工厂。
  • 错误本身表明,不能在 JAVA 中对最终类进行子类化。我认为在您的代码中某处您正试图扩展最终类。它不是测试特定的问题。
  • 最后一节课是业务需求为了测试,我必须使用 PowerMockito.mock 来模拟最后一节课,但这是失败的。 AbstractPowerMockProcessorTest 只是一个模拟应用程序特定类的类,用于测试目的,以便在不同测试中实现可重用性。问题是无论如何我需要模拟最终课程。
  • @GauravP 您可能会发现以下内容很有帮助:objectpartners.com/2012/03/15/…

标签: mockito testng powermock powermockito


【解决方案1】:

首先,如果你使用TestNG,我想知道你为什么有@RunWith(PowerMockRunner.class)。它是 jUnit 模块的一部分,并与 jUnit 集成,而不是 TestNG。请查看 PowerMock wiki 上的 TestNG usage

第二个错误,我在您的代码中没有看到mockStatic(AskStateParams.class)。请再次检查documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多