首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

ReflectionTestUtils不与MockitoJunitRunner一起使用

ReflectionTestUtils是Spring框架提供的一个工具类,用于在测试中访问和修改私有字段、调用私有方法以及设置依赖注入的属性。它可以帮助我们在单元测试中模拟和修改对象的内部状态,以便更好地进行测试。

MockitoJunitRunner是Mockito框架提供的一个JUnit运行器,用于简化使用Mockito进行单元测试的流程。它可以自动初始化被测试对象,并处理依赖注入和模拟对象的创建。

在某些情况下,ReflectionTestUtils和MockitoJunitRunner可能会产生冲突,导致测试失败或出现意外行为。这可能是因为它们都试图修改对象的内部状态,但使用不同的机制和策略。

为了解决这个问题,我们可以采取以下几种方法:

  1. 不使用ReflectionTestUtils:如果不需要访问和修改私有字段或调用私有方法,可以直接使用公共接口和方法进行测试。这样可以避免ReflectionTestUtils的使用,也不会与MockitoJunitRunner产生冲突。
  2. 使用其他替代方案:如果需要在测试中访问和修改私有字段或调用私有方法,可以考虑使用其他替代方案,如使用反射API手动实现相同的功能。这样可以避免使用ReflectionTestUtils,从而避免与MockitoJunitRunner的冲突。
  3. 分离测试:将需要使用ReflectionTestUtils的测试和需要使用MockitoJunitRunner的测试分开进行。这样可以避免它们之间的冲突,并确保测试的独立性和可靠性。

总结起来,ReflectionTestUtils和MockitoJunitRunner在某些情况下可能会产生冲突,但我们可以通过不使用ReflectionTestUtils、使用其他替代方案或分离测试来解决这个问题。在具体的测试场景中,我们需要根据实际情况选择合适的解决方案。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

跨层单元测试de歪门邪道

一般来说,Spring应用的单元测试都是发生在该应用的某个层,例如controller、service或者是dao层。 而service层既是应用服务的主要实现者,也是重点被测试的对象,其余各层,如controller层一般以线性代码为主,缺少业务逻辑,可以少测甚至是不测。 不过也有些团队会认为,既然应用的入口是controller,那么从controller层入口对服务进行测试,更贴合用户的场景,这部分的测试也更有业务价值,也更能提升对产品质量的信心。如果某些测试场景或者分支是通过controller层无法达到的,那么这部分的测试优先级就可以降低。 因此,笔者就见到过controller连同service一起进行测试的场景,也就是所谓的跨层单元测试 还是以TestLink4J为例,有如下用例

01
  • EasyMock PowerMock 的简单使用(with spring Autowired)


    import java.math.BigDecimal;

    import org.easymock.EasyMock;
    import org.junit.Assert;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.powermock.api.easymock.PowerMock;
    import org.powermock.core.classloader.annotations.PowerMockIgnore;
    import org.powermock.core.classloader.annotations.PrepareForTest;
    import org.powermock.modules.junit4.PowerMockRunner;
    import org.springframework.aop.framework.Advised;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.util.ReflectionTestUtils;

    @RunWith(PowerMockRunner.class)
    @PrepareForTest( { PaymentReconService.class })
    @PowerMockIgnore(“org.apache.log4j.*”)
    public class PaymentGatherServiceTest extends PaymentServiceTestBase {

    @Autowired
    private GatherService gatherResultService;
    @Autowired
    private PaymentBaseDAO baseDAO;

    /**
    * 测试正常postback
    */
    public void testPaymentSucc() {
    PaymentReconService mock = mock();

    Long pbId = 10004L;
    String pbStatus = PaymentBaseEO.PB_STATUS_GATHER_SUCC;
    BigDecimal succAmount = new BigDecimal(“99.3”);

    try {
    GatherOrderRO ro = gatherResultService.processPaymentGather(pbId, pbStatus, succAmount, succAmount);
    assertNotNull(ro);

    } catch (SystemException e) {
    fail(e.getLocalizedMessage());
    } catch (BusinessException e) {
    fail(e.getBusinessCode());
    }
    EasyMock.verify(mock);
    }

    /**
    * MOCK PaymentReconService实现
    * @return
    */
    private PaymentReconService mock() {
    PaymentReconRO mockRO = new PaymentReconRO(PaymentReconRO.Status.SUCESS, “OK”);

    PaymentReconService mock = EasyMock.createMock(PaymentReconServiceImpl.class);
    EasyMock.expect(mock.paymentSuccessRecon(EasyMock.anyObject(Long.class))).andReturn(mockRO);
    EasyMock.replay(mock);
    //这里把依赖的数据注进去
    ReflectionTestUtils.s

    03

    使用Mockito修改Bean的依赖

    在使用单元测试时经常会遇到某些dependency依赖了外部资源,或者想主动绕过真正的方法执行mock返回结果而快速得到单元测试最终的期望结果,可能有以下两种场景, 对于TestCase A,设单元测试的方法是Service A的execute1方法和execute2方法,在执行execute1和execute2方法时都会调用ServiceB的不同方法,即ServiceA依赖了ServiceB;一个场景是完全对ServiceB进行Mock,如单元测试ServiceA#execute1方法时都通过Mock返回结果;一个场景是部分ServiceB的方法执行真实的业务逻辑(如查询数据库),一部分方法执行Mock返回结果,或Spy,如如单元测试ServiceA#execute2方法时,只mock ServiceB#b2结果,真正执行ServiceB#b1方法。

    02

    Spring Boot 应用的测试Spring Boot 应用的测试

    本书写到这里,Spring Boot 2.0.0.RC1版本已经于2018.1.31 发布。这是本书最后一章,本章介绍 Spring Boot 应用的测试(质量保障)相关的内容。我们在项目开发中使用分层架构,在测试中也进行分层测试。 1.1 准备工作 本节先来创建一个基于Spring MVC、 Spring Data JPA的 Spring Boot, 完成Dao 层、 Service 层、Controller 层代码的编写,为后面的测试代码的编写做准备。 使用http://start.spring.io/ 创建项目、导入此 Gradle 项目到 IDEA 中。配置 Kotlin Compiler 版本与Target JVM 版本。最后等待项目构建完毕。我们将得到一个初始Spring Boot 工程。详细的代码参考本章给出的示例工程源码。 下面我们来详细讲解怎样针对 Spring Boot 项目进行分层测试。 1.2 分层测试 我们在开发阶段过程中,单元测试通常是必要的。Spring Boot 提供的spring-boot-test 模块基于 spring-test 模块和junit 框架,封装集成了功能强大的结果匹配校验器assertj 、hamcrest Matcher、 Web 请求 Mock 对象、 httpclient、JsonPath (测试 JSON 数据)、mockito、selenium等。 测试代码通常放在 src/test 目录下,包目录规范是跟 src/main 目录保持一致。测试代码目录结构设计如下

    03
    领券