- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最近,我开始使用 EasyMock 3.2 及其非常喜欢的基于注释的测试功能。但是,当我遇到不知道如何处理的异常时,我遇到了这种情况。我对这种情况进行了建模,并寻求有关如何测试我的类(class)的建议
假设我有一个类 Line,它包含两个参数 a 和 b,并且可以计算 y(x) = a * x + b 的值.
假设我有一个接口(interface) Param 来表示 a 和 b(无论出于何种原因,这只是一个示例):
所以我的类看起来像这样:
public class Line {
private Param paramA;
private Param paramB;
public int calculate(int x) {
return paramA.intValue() * x + paramB.intValue();
}
}
接口(interface)参数也非常简单:
public interface Param {
int intValue();
}
现在我要为它创建一个测试。我在 Java 7 上使用 JUnit,在 IntelliJ 中使用 EasyMock 3.2。
import org.easymock.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import static org.junit.Assert.*;
import static org.easymock.EasyMock.*;
@RunWith(EasyMockRunner.class)
public class LineTest extends EasyMockSupport {
@TestSubject
private Line testSubject = new Line();
@Mock(name = "paramA") //I've tried with and without 'name'
private Param paramA;
@Mock(name = "paramB")
private Param paramB;
@Test
public void test() {
expect(paramA.intValue()).andReturn(2);
expect(paramB.intValue()).andReturn(4);
replayAll();
int actualResult = testSubject.calculate(3);
// I expect to observe actualResult = 3 * 2 + 4 = 10
assertEquals(10, actualResult);
verifyAll();
}
}
到目前为止一切顺利,但是运行测试会产生以下异常:
java.lang.RuntimeException: At least two mocks can be assigned to private
Param Line.paramA: paramA and paramB
at org.easymock.EasyMockSupport.injectMocksOnClass(EasyMockSupport.java:665)
at org.easymock.EasyMockSupport.injectMocks(EasyMockSupport.java:640)
at org.easymock.EasyMockStatement.evaluate(EasyMockRunner.java:55)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.junit.runner.JUnitCore.run(JUnitCore.java:160)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
看起来 easymock 无法通过字段名称注入(inject)模拟,而是尝试通过类型进行模拟,但因歧义而失败。
我的错误是什么?
提前致谢,祝您有愉快的一天
最佳答案
你读过 docs 了吗?那具体解释这部分?您应该使用 fieldName
限定符来消除此类分配的歧义。
The annotation has an optional element,
'type'
, to refine the mock as a'nice'
mock or a'strict'
mock. Another optional annotation,'name'
, allows setting of a name for the mock that will be used in thecreateMock
call, which will appear in expectation failure messages for example. Finally, an optional element,"fieldName"
, allows specifying the target field name where the mock should be injected. Mocks are injected to any field in any@TestSubject
that is of compatible type. If more than one mock can be assigned to the same field then this is considered an error. ThefieldName
qualifier can be used in this scenario to disambiguate the assignments.
强调我的。
关于java - EasyMock 和 Annotations 以及 2 个相同类型的依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25848460/
我的问题是 this one. 的一个分支 我有一个要验证的注释(比如电话注释)。我可以使用@phone 验证器来检查电话对象是否有效。我还希望能够将此验证器放在包含电话的联系信息对象上。有没有一种方
我的问题是 this one. 的一个分支 我有一个要验证的注释(比如电话注释)。我可以使用@phone 验证器来检查电话对象是否有效。我还希望能够将此验证器放在包含电话的联系信息对象上。有没有一种方
例如 class LoggingService [Inject] (protected val logger: Logger) class LoggingService @Inject (protec
你觉得你是java高手吗? 您是否深谙反射 API 的 secret ? public @interface @a {} public @interface @b {} @Mark public @i
我对 Spring 和 JUnit 非常陌生。我正在尝试为 spring 服务类运行一个简单的 JUnit 测试用例,但它失败了,我得到了这个异常。我还没有编写任何测试,但在实现之前尝试运行。使用to
对于spring和JUnit来说是非常新的东西。 我正在尝试为spring服务类运行一个简单的JUnit测试用例,但是失败了,并且出现了这个异常。我还没有编写任何测试,但是尝试在实现之前进行测试。 使
我有一个实体Test,它将从特征中获取它的属性(和基本方法): class Test { use Trait_title; } trait Trait_title{ /** *
我(当然)正在尝试使用许多我不太了解的构造来维护一个项目。在尝试弄清楚 Spring 中 AOP 使用的过程中,我遇到了带有以下注释的方法: @Around(value = "@annotation(
目前我正在编写一个注释处理器,它将生成新的源代码。该处理器与应用程序本身隔离,因为它是构建项目的一个步骤,我将整个构建系统与应用程序分开。 这就是问题开始的地方,因为我想处理在应用程序中创建的注释。我
我将 Vertx Service Gen 注释处理器与 Kotlin kapt 结合使用。 在注释处理器启动之前,我的 kapt 失败,到处都是以下异常消息: error: scoping const
我很难弄清楚如何从其实际实现类中获取对 java.lang.annotation.Annotation 的引用。 注释本身看起来像这样(来自框架): @Target({ElementType.TYPE
如何创建类似的注释 @Table(name="batch", uniqueConstraints= @UniqueConstraint(columnNames = {"compound_id"
我刚开始使用Spring Boot,我收到这个错误已经有一段时间了,不幸的是无法修复它。从那时起,我一直在谷歌上搜索,但仍然找不到我做错了什么。在我的代码下面找到:。实体。刀。主要。误差率。启动App
输出文本: Execution failed for task ':app:checkDebugDuplicateClasses'. 1 exception was raised by worker
假设我想使用宏注释来复制@specialized(Int) 之类的注释——我知道这很疯狂。像这样的东西: class expand(expanded: Any*) extends Annotation
假设我想使用宏注释来复制@specialized(Int) 之类的注释——我知道这很疯狂。像这样的东西: class expand(expanded: Any*) extends Annotation
注解处理过程中我目前正在处理一个方法的注解: @Override public boolean process(Set elements, RoundEnvironment env) { Mess
我有接口(interface)资源和几个实现它的类,例如音频、视频...此外,我创建了自定义注释MyAnnotation: @MyAnnotation(type = Audio.class) cl
我的项目包括较旧的未注释 Controller 和较新的基于注释的 Controller 。 我使用的是最新的 Spring jar (3.0.5),在我的 dispatcher-servlet.xm
我正在写一些简单的 win32 东西,我正在使用以下 wWinMain int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance
我是一名优秀的程序员,十分优秀!