Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java EasyMock和参数化测试(JUnit参数化)_Java_Junit4_Easymock_Parameterized - Fatal编程技术网

Java EasyMock和参数化测试(JUnit参数化)

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

我想在参数化测试类内的类上使用@Mock。但是由于某些原因,mockClassB是空的。我的代码类似于

@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();
    }
}