protected int parseExpire(CacheContext ctx) throws AttributeDefineException {
Method targetMethod = ctx.getTargetMethod();
CacheEnable cacheEnable = targetMethod.getAnnotation(CacheEnable.class);
ExpireExpr cacheExpire = targetMethod.getAnnotation(ExpireExpr.class);
// check for duplicate setting
if (cacheEnable.expire() != CacheAttribute.DO_NOT_EXPIRE && cacheExpire != null) {
throw new AttributeDefineException("expire are defined both in @CacheEnable and @ExpireExpr");
}
// expire time defined in @CacheEnable or @ExpireExpr
return cacheEnable.expire() != CacheAttribute.DO_NOT_EXPIRE ? cacheEnable.expire() : parseExpireExpr(cacheExpire, ctx.getArgument());
}
这就是要测试的方法,
Method targetMethod = ctx.getTargetMethod();
CacheEnable cacheEnable = targetMethod.getAnnotation(CacheEnable.class);
我必须模拟三个CacheContext、Method和CacheEnable。有什么想法可以让测试用例更简单吗?
5条答案
按热度按时间j8ag8udp1#
Mockito可以处理链接存根:
AFAIK,链中的第一个方法返回一个mock,它被设置为在第二个链接的方法调用时返回您的值。
Mockito的作者指出,这应该 * 只用于遗留代码 *。否则,更好的做法是将行为推入CacheContext,并提供它完成工作所需的任何信息。从CacheContext提取的信息量表明,您的类具有feature envy。
iszxjhcz2#
如果你使用Kotlin.MockK,它并没有说链接是一种不好的做法,而是很容易地允许你这样做。
j2cgzkjk3#
我的建议是重构您的方法,使您的测试用例更简单。
每当我发现自己在测试一个方法时遇到麻烦,我就会问为什么它很难测试。如果代码很难测试,那么它很可能很难使用和维护。
在这种情况下,这是因为你有一个深入到几个层次的方法链,也许传入ctx、cacheEnable和cacheExpire作为参数。
nszi6y054#
我发现JMockit更容易使用,并且完全切换到它。查看使用它的测试用例:
https://github.com/ko5tik/andject/blob/master/src/test/java/de/pribluda/android/andject/ViewInjectionTest.java
在这里我模拟了Activity基类,它来自Android SKD并且完全是存根。使用JMockit,你可以模拟final,private,abstract或者其他任何东西。
在您的测试用例中,它看起来像这样:
wljmcqd85#
在Lunivore's answer上扩展,对于任何注入模拟bean的人,使用: