java - 使用 Guice 和 JMockit 对拦截器进行单元测试

标签 java junit guice jmockit

我不熟悉为方面编写单元测试。在阅读了一些单元测试方面的内容后,我得出的结论是要编写两种类型的测试:测试方面的逻辑,以及测试拦截(即拦截是否正确)。我有一个逻辑部分的单元测试。但是,我一直在为拦截部分的测试而苦苦挣扎。

我正在使用 JUnit 4、JMockit 和 Guice(针对 CDI 和 AOP)编写我的测试。

下面的类是我的方面,它记录了方法调用的执行时间。

class ExecutionTime implements MethodInterceptor {
    private static final Logger logger = ...
    public Object invoke(MethodInvocation invocation) throws Throwable {
        final long start = System.nanoTime();
        try {
            return invocation.proceed();
        } finally {
            final long end = System.nanoTime();
            logger.trace(...);
        }
    }
}

在 Guice 中,我创建了一个用于初始化注入(inject)器的 Module。代码如下。该绑定(bind)表示任何未使用 @DoNotProfile 注释的类和方法都将被 ExecutionTime 方面忽略。

class ProfilingModule extends AbstractModule {
    public void configure() {
        bindInterceptor(not(annotatedWith(DoNotProfile.class)),
            not(annotatedWith(DoNotProfile.class)), new ExecutionTime());
    }
}

接下来,我定义了一个测试类,我可以在其中测试方法是否被正确拦截。一些方法用 @DoNotProfile 注释。

class TestClass {
    public void methodA() {}
    @DoNotProfile public void methodB() {}
    ...
}

最后,在我的测试类中,我的测试方法中有以下代码。

@Test
public void test() throws Throwable {
    Injector injector = Guice.createInjector(new ProfilingModule());
    ... // not sure what to do next
}

我不确定下一步该做什么。我尝试了以下方法。

  1. 我创建了另一个拦截器来拦截 ExecutionTime 类的 invoke 方法。但是,我无法让它工作。
  2. 我创建了一个与 ExecutionTime 具有相同绑定(bind)的测试拦截器和一个测试模块。即,.createInjector(new TestModule())。但我意识到这违背了本次测试的目的,即测试接线是否正常工作。

我感谢任何关于此事的见解和帮助。

最佳答案

如果您遇到这类问题,请退一步重新思考:我的应用程序的构建 block 是什么?然后将这些作为任意单元进行测试。

在您的情况下:“MethodInterceptor 是否使用正确的值调用记录器”和“模块是否正确绑定(bind)了 ExecutionListener”。我假设您已经完成了第一个。

对于第二个:覆盖单元测试中的模块以为 ExecutionListener 提供模拟,然后根据注释的存在验证其“invoke”方法是否被调用。

由于 MethodInterceptors 只能绑定(bind)为具体实例,最简单的方法是为传递 ExecutionListener 实例的模块提供一个构造函数。然后您可以使用一个新实例作为默认实例并在测试中通过模拟。

关于java - 使用 Guice 和 JMockit 对拦截器进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29284808/

相关文章:

java - Mockito验证调用错误

java - Guice辅助注入(inject)

java - 使用类别注释在 IntelliJ 中运行 JUnit 测试

java - jpanel 中图像的对齐

java - 在Android中绘制动态自定义 View 棋盘

java - OrientDB 的 OGM/ORM

java - 在终端中编译/运行 JUnit 测试 - 无法找到或加载主类

jetty - 将 GuiceFilter 与 Jetty WebAppContext.setParentLoaderPriority(true) 一起使用

java - 使用依赖注入(inject)在方法内初始化抽象类的子类

java - 如何在 SWT 的 SashForm 上显示句柄?