Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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部分模拟模板方法_Java_Easymock - Fatal编程技术网

Java 用EasyMock部分模拟模板方法

Java 用EasyMock部分模拟模板方法,java,easymock,Java,Easymock,我有几个类遵循“模板方法”模式。抽象类A和具体扩展B和C。如下所示: 公共抽象类A { 受保护的抽象字符串getData()引发一些异常; public void doWork()引发其他异常 { 尝试 { //业务逻辑。。。 字符串数据=this.getData(); //更多业务逻辑。。。 } 捕获(某些例外) { 对数(“…”,e); 抛出新的OtherException(“…”,e); } } } 公共类B扩展了A { 受保护的字符串getData()引发某些异常 { //依赖于大量依赖

我有几个类遵循“模板方法”模式。抽象类A和具体扩展B和C。如下所示:

公共抽象类A
{
受保护的抽象字符串getData()引发一些异常;
public void doWork()引发其他异常
{
尝试
{
//业务逻辑。。。
字符串数据=this.getData();
//更多业务逻辑。。。
}
捕获(某些例外)
{
对数(“…”,e);
抛出新的OtherException(“…”,e);
}
}
}
公共类B扩展了A
{
受保护的字符串getData()引发某些异常
{
//依赖于大量依赖关系的复杂逻辑
}
}
公共类C扩展了
{
受保护的字符串getData()引发某些异常
{
//依赖大量依赖关系的不同但同样复杂的逻辑
}
}
我想编写一个测试来验证getData()何时抛出某个异常以及是否抛出了其他异常。我真的希望避免模拟所有复杂的依赖项,这些依赖项是强制getData()抛出的必要条件。我不在乎getData()如何抛出,我只希望它抛出。所以我想我想要的是一个局部的模拟。这就是我所拥有的:

import static org.easymock.easymock.*;
....
@测试(预期=OtherException.class)
public void testSomethingOrAnother()引发异常
{
B target=createMockBuilder(B.class).addMockedMethod(“getData”).createMock();
expect(target.getData()).anthrow(SomeException.class).once();
重播(目标)
尝试
{
target.doWork();//期望此操作引发OtherException;
}
最后
{
验证(目标);
}
}
该测试对我来说很好,但当我运行它时,我得到以下结果:

java.lang.Exception:意外异常,应为,但为
... 为简洁起见删除了。。。
原因:java.lang.RuntimeException:名称不明确:有多个方法命名为getData
位于org.easymock.internal.ReflectionUtils.findMethod(ReflectionUtils.java:96)
位于org.easymock.internal.ReflectionUtils.findMethod(ReflectionUtils.java:64)
在org.easymock.internal.MockBuilder.addMockedMethod(MockBuilder.java:73)上
位于org.easymock.internal.MockBuilder.addMockedMethods(MockBuilder.java:92)
位于com.mycompany.more.packages.BTest(BTest.java:83)
... 为简洁起见删除了。。。
... 还有16个
需要明确的是:层次结构中的任何地方都没有getData()方法的重载

EasyMock能做我想做的事吗?我错过了什么

相关版本号:

  • EasyMock 3.0
  • JUnit4.4
  • Java 1.6

我认为您的问题可能是使用addMockedMethod(字符串)。不知道如果没有重载,为什么EasyMock会抱怨方法名不明确。但以下几点对我起了作用:

@Test
        public void testSomethingOrAnother() {
            B target = null;
            try {
                target = EasyMock.createMockBuilder(B.class).addMockedMethod(B.class.getDeclaredMethod("getData")).createMock();
                EasyMock.expect(target.getData()).andThrow(new SomeException());
                EasyMock.replay(target);
            } catch (NoSuchMethodException e) {
                fail(e.getMessage());
            } catch (SomeException e) {
                fail(e.getMessage());
            }

            try {
                target.doWork();
                fail("doWork should have thrown an exception");
            } catch (OtherException e) {
                //pass
            }
        }

使用Easymock:3.2,您可以指定方法的参数类型。看看
IMockBuilder\addMockedMethod(字符串方法名、类…参数类型)

谢谢。

谢谢!我自己也试着走这条路,但你的反思比我的要好。:)