Java EasyMock和参数化测试(JUnit参数化)
我想在参数化测试类内的类上使用@Mock。但是由于某些原因,mockClassB是空的。我的代码类似于Java EasyMock和参数化测试(JUnit参数化),java,junit4,easymock,parameterized,Java,Junit4,Easymock,Parameterized,我想在参数化测试类内的类上使用@Mock。但是由于某些原因,mockClassB是空的。我的代码类似于 @RunWith(Parameterized.class) public class ClassATest extends EasyMockSupport { private String uniqueIdentifier; private String value; @Mock private ClassB mockClassB; public
@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {
private String uniqueIdentifier;
private String value;
@Mock
private ClassB mockClassB;
public ClassATest(String uniqueIdentified, String value) {
this.uniqueIdentifier = uniqueIdentified;
this.value = value;
}
...
@Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{"1", "val1"},
{"2", "val2"}});
}
@Test
public void testMethod() {
...
expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value); // mockClassB is NULL
replayAll();
....
}
}
@RunWith(参数化的.class)
公共类ClassATest扩展了EasyMockSupport{
专用字符串唯一标识符;
私有字符串值;
@嘲弄
私有类B和私有类B;
公共类测试(字符串唯一标识,字符串值){
this.uniqueIdentifier=uniqueIdentified;
这个值=值;
}
...
@Parameterized.Parameters(name=“{index}:id={0};value={1}”)
公共静态收集数据(){
返回Arrays.asList(新对象[][]{
{“1”,“val1”},
{“2”,“val2”});
}
@试验
公共void testMethod(){
...
expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value);//mockClassB为NULL
replayAll();
....
}
}
是否可以在参数化类中创建模拟对象?尝试添加设置方法:
@Before
public void setUp() {
initMocks(this);
}
下面将查看正确的代码
@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {
private String uniqueIdentifier;
private String value;
private ClassB mockClassB;
public ClassATest(String uniqueIdentified, String value) {
this.uniqueIdentifier = uniqueIdentified;
this.value = value;
}
...
@Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{"1", "val1"},
{"2", "val2"}});
}
@Before
public void setup() {
...
mockClassB = mock(ClassB.class);
...
}
@Test
public void testMethod() {
...
expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value); // mockClassB will be mocked :)
replayAll();
....
}
}
@RunWith(参数化的.class)
公共类ClassATest扩展了EasyMockSupport{
专用字符串唯一标识符;
私有字符串值;
私有类B和私有类B;
公共类测试(字符串唯一标识,字符串值){
this.uniqueIdentifier=uniqueIdentified;
这个值=值;
}
...
@Parameterized.Parameters(name=“{index}:id={0};value={1}”)
公共静态收集数据(){
返回Arrays.asList(新对象[][]{
{“1”,“val1”},
{“2”,“val2”});
}
@以前
公共作废设置(){
...
mockClassB=mock(ClassB.class);
...
}
@试验
公共void testMethod(){
...
expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value);//mockClassB将被模拟:)
replayAll();
....
}
}
EasyMock需要一个规则或运行程序来实例化带注释的模拟。因为您已经在使用跑步者,所以您唯一的选择是规则。以下内容将起作用
@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {
@Rule
public EasyMockRule rule = new EasyMockRule(this);
private String uniqueIdentifier;
private String value;
@Mock
private ClassB mockClassB;
public ClassATest(String uniqueIdentified, String value) {
this.uniqueIdentifier = uniqueIdentified;
this.value = value;
}
@Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{"1", "val1"},
{"2", "val2"}});
}
@Test
public void testMethod() {
expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value); // mockClassB is NULL
replayAll();
}
}
不幸的是,initMocks不是一种EasyMock方法,而是
injectMocks
Yes。但是你不再使用注释了。但当然,它是有效的。
@RunWith(Parameterized.class)
public class ClassATest extends EasyMockSupport {
private String uniqueIdentifier;
private String value;
@Mock
private ClassB mockClassB;
public ClassATest(String uniqueIdentified, String value) {
this.uniqueIdentifier = uniqueIdentified;
this.value = value;
}
@Before
public void before() {
injectMocks(this);
}
@Parameterized.Parameters(name = "{index}: id = {0}; value = {1}")
public static Collection<Object[]> data() {
return Arrays.asList(new Object[][]{
{"1", "val1"},
{"2", "val2"}});
}
@Test
public void testMethod() {
expect(mockClassB.someMethod(uniqueIdentifier)).andReturn(value); // mockClassB is NULL
replayAll();
}
}