当前位置: 首页 > 知识库问答 >
问题:

不使用PowerMock或PowerMockito的单元测试单例

慕弘义
2023-03-14

我正在为一个单例Java类编写单元测试(使用JUnit和Mockito)。我无法更改类实现本身。

使用PowerMockito,它是这样的(并且工作):

@Mock
    private TheSingleton theSingleton;

@Before
    public final void setUp()
        throws Exception
    {
        MockitoAnnotations.initMocks( this );

        PowerMockito.mockStatic( TheSingleton.class );
        when( TheSingleton.getInstance() ).thenReturn( theSingleton );
        ...
    }

要求重写测试,而不使用PowerMock或PowerMockito或任何其他静态模拟API。由于我不能将单例类更改为使用依赖注入,我不确定什么是这样做的好方法。

任何帮助都将不胜感激。

共有2个答案

傅博容
2023-03-14

榴莲球形是实现这一目标的一种无反射方式。您确实牺牲了一点点运行时性能,但在我们的任何生产用例中,这还不是一个可测量的数量。

柳轶
2023-03-14

你基本上没有其他选择。如果没有任何类型的静态模拟框架,比如PowerMock或PowerMockito,或者编写自己的代码来完成与它们相同的工作,您将无法完成您想要的工作。对不起,我知道这不是你想要的答案,但我相信这就是答案。

另请参见如何通过反射更改方法行为?为什么Mockito不模拟静态方法?了解更多信息。

 类似资料:
  • 我有一个带有静态方法的惰性单例类,该静态方法返回上的实例: 我如何使用PowerMockito模拟单例并测试方法。 我没有选择singleton,因为应用程序中只有的单个实例(根据MongoDB文档)。 谢谢你

  • 是否有人能够从Maven Build获得JaCoCo中JMockit和Powermock单元测试的复盖范围? 我有一个Powermock单元测试的现有测试集,我希望逐步将其迁移到JMockit。但是我需要能够在一个报告中看到所有单元测试的测试覆盖范围,最好是在Sonar中。 通过将JaCoCo置于“脱机”模式,我确实使JMockit和Powermock测试与Surefire/JaCoCo一起运行(

  • 我正在为一个Android库设置单元测试代码覆盖率,该库使用Robolectric运行测试,并使用PowerMock/Mockito进行模拟测试。 但是,使用Cobertura运行单元测试会导致以下异常... *即使用PowerMock注释测试,删除注释、和调用。 我看到一些用户通过在他们的测试套件中设置来修复类似的问题。 但是,这不是解决方案,因为我使用的是Gradle,它在Java项目上默认为

  • 我正试图在詹金斯的sonarqube仪表板上获取代码覆盖率报告。代码覆盖率报告即将发布,但仅显示4.6%的覆盖率。经过调查,我发现使用PowerMock编写的测试类被跳过了。 经过进一步调查,我发现“JaCoCo不能很好地处理动态修改/创建的类(这就是powermock的工作方式)。这是一个已知的限制,我们目前对此无能为力”。 是否有任何解决办法,以便我也可以为使用PowerMock编写的测试类获

  • } 我正在努力解决这个问题。请帮帮我...谢谢。

  • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。