Java 使用Guice和JMockit的单元测试拦截器

Java 使用Guice和JMockit的单元测试拦截器,java,junit,guice,jmockit,Java,Junit,Guice,Jmockit,我还不熟悉为方面编写单元测试。在阅读了一些单元测试方面的内容后,我得出结论,有两种类型的测试需要编写:测试方面的逻辑和测试拦截(即,它是否正确拦截)。我有一个逻辑部分的单元测试。然而,我一直在努力为拦截部分做一个测试 我正在使用JUnit4、JMockit和Guice(用于CDI和AOP)编写测试 下面的类是我的方面,它记录方法调用的执行时间 class ExecutionTime implements MethodInterceptor { private static final L

我还不熟悉为方面编写单元测试。在阅读了一些单元测试方面的内容后,我得出结论,有两种类型的测试需要编写:测试方面的逻辑和测试拦截(即,它是否正确拦截)。我有一个逻辑部分的单元测试。然而,我一直在努力为拦截部分做一个测试

我正在使用JUnit4、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中,我创建了一个
模块
,用于初始化喷油器。代码如下。绑定表示,
ExecutionTime
方面将忽略任何未使用
@DoNotProfile
注释的类和方法

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
}
我不确定下一步该怎么办。我试过以下方法

  • 我创建了另一个拦截器来拦截
    ExecutionTime
    类的
    invoke
    方法。然而,我无法让它工作
  • 我创建了一个与
    ExecutionTime
    绑定相同的测试拦截器,并创建了一个测试模块。也就是说,
    .createInjector(新的TestModule())
    。但我意识到这违背了测试的目的,即测试接线是否正常工作

  • 我感谢您在这方面提供的任何见解和帮助。

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

    在您的例子中:“MethodInterceptor是否使用正确的值调用记录器”和“模块是否正确绑定ExecutionListener”。我想你已经完成了第一个

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


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

    如果您已经对
    ExecutionTime
    类进行了单元测试(正如“我对逻辑测试没有问题”所暗示的那样),那么只剩下单元测试
    ProfilingModule
    中的逻辑。我不知道Guice是否公开了一些API来检查配置的模块;如果是这样,那就足够了。现在,也许最好在这里编写一个集成测试,测试将启动带有评测模块的Guice,以某种任意方式运行一组应用程序类,最后验证对
    记录器
    内部
    ExecutionTime
    的预期调用是否确实发生。