Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 Mockito:mock()调用real方法_Java_Unit Testing_Mockito - Fatal编程技术网

Java Mockito:mock()调用real方法

Java Mockito:mock()调用real方法,java,unit-testing,mockito,Java,Unit Testing,Mockito,我是Mockito的新手,我在Eclipse中与JUnit4一起使用它。 我试图模仿我的方法如下: CartLine=mock(CartLine.class) 然后我得到:FileNotFoundException,这是由于调用假定的模拟方法引起的,如下面的stacktrace所示。这是怎样的预期行为?我使用Mockito正是为了避免使用整个环境 堆栈跟踪: java.io.FileNotFoundException: cart.properties (file not found) at ja

我是Mockito的新手,我在Eclipse中与JUnit4一起使用它。 我试图模仿我的方法如下:
CartLine=mock(CartLine.class)
然后我得到:
FileNotFoundException
,这是由于调用假定的模拟方法引起的,如下面的stacktrace所示。这是怎样的预期行为?我使用Mockito正是为了避免使用整个环境

堆栈跟踪:

java.io.FileNotFoundException: cart.properties (file not found)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at com.mycompany.cart.util.ResourceFactory.getFileInputStream(ResourceFactory.java:119)
at com.mycompany.cart.util.ResourceFactory.getProperties(ResourceFactory.java:295)
at com.mycompany.cart.CartSettings.tryLoadSettings(CartSettings.java:215)
at com.mycompany.cart.CartSettings.<init>(CartSettings.java:72)
at com.mycompany.cart.CartSettings.<clinit>(CartSettings.java:60)
at com.mycompany.cart.CartLine.<clinit>(CartLine.java:59)
at sun.reflect.GeneratedSerializationConstructorAccessor4.newInstance(Unknown Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at org.objenesis.instantiator.sun.SunReflectionFactoryInstantiator.newInstance(SunReflectionFactoryInstantiator.java:40)
at org.objenesis.ObjenesisBase.newInstance(ObjenesisBase.java:59)
at org.mockito.internal.creation.jmock.ClassImposterizer.createProxy(ClassImposterizer.java:128)
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:63)
at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:56)
at org.mockito.internal.creation.CglibMockMaker.createMock(CglibMockMaker.java:23)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:51)
at org.mockito.Mockito.mock(Mockito.java:1243)
at org.mockito.Mockito.mock(Mockito.java:1120)
at com.redacted.ml.TestConfToJasper.mockCartLine(TestConfToJasper.java:173)
at com.redacted.ml.TestConfToJasper.mockCartLines(TestConfToJasper.java:131)
at com.redacted.ml.TestConfToJasper.testBuildUCSElement(TestConfToJasper.java:75)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
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.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
1249 [main] WARN com.redacted.cart.util.ResourceFactory  - Can not find property file:   cart.properties
1249 [main] FATAL com.redacted.cart.CartSettings  - Can not load cart properties!
召集人:

private static final CartLine[] mockCartLines() {
    CartLine[] lines = new CartLine[10];
    int i=0;

    lines[i++] = mockCartLine(LineType.FO);
            [...]   
    return lines;
}
@Test
public void testBuildUCSElement() {
    ConfToJasper ctj = new ConfToJasper(confML);

    CartController controller = mock(CartController.class);
    CartDataObject dataObject = mock(CartDataObject.class);
    CartLine[] lines = mockCartLines();
[...]
}
召集人:

private static final CartLine[] mockCartLines() {
    CartLine[] lines = new CartLine[10];
    int i=0;

    lines[i++] = mockCartLine(LineType.FO);
            [...]   
    return lines;
}
@Test
public void testBuildUCSElement() {
    ConfToJasper ctj = new ConfToJasper(confML);

    CartController controller = mock(CartController.class);
    CartDataObject dataObject = mock(CartDataObject.class);
    CartLine[] lines = mockCartLines();
[...]
}

(我不是此代码的创建者)

在我看来,您的CartLine中有某种静态初始值设定项试图打开文件流

我强烈建议您通过删除此类静态初始值设定项逻辑来清理代码,使其对单元测试友好。(将其改为实例方法通常更合适)

或者,您的测试资源中可能有一个虚拟的“cart.properties1”,以便您的CartLine可以读取它


或您可以考虑使用PosiMoCK来查看它是否有助于避免这样的问题(我怀疑……)< /P>请发布您的测试代码;堆栈跟踪不足以提供帮助。您可以发布整个测试方法吗?

CartLine
类是最终的吗?如果是这样的话,你就不能用Mockito来模仿它。你需要发布
CartLine
代码,那里有一些古怪的东西
CartLine
不能是final,但是(Mockito会提出一个
MockitoException
说类是final)我没有
CartLine
代码,我只是将其作为API的一部分使用……我发布了测试代码,我不是自己编写的。我不知道为什么调用方法是静态的,但是我尝试删除了静态的,得到了相同的结果。我不确定为什么静态初始值设定项会导致调用real方法而不是mock方法。你能解释一下吗?我想问题不是调用真实方法引起的。正如我所说,抛出异常的是静态初始值设定项(堆栈跟踪中的clinit)。看看CartLine类的静态初始化逻辑我看不到CartLine的静态初始化。事实上,在我的整个测试类中,除了我在OP post中添加的代码位之外,
static
关键字的唯一用途是Mockito和Junit导入、一些静态最终字符串和
@BeforeClass
方法。但我真正想了解的是:mockito在
mock()
中调用真正的方法是正常行为吗?因为不管CartLine是静态初始化还是正常初始化,都不应该调用它。(我加上了我在帖子中首先省略的stacktrace的Beginning)谢谢你的时间。不,不应该叫它。我相信在CartLine中存在不明显的静态初始化逻辑,这导致了问题。从堆栈跟踪中,
com.mycompany.cart.CartLine。
实际上表示CartLine类的类init(表示静态初始化)。使用类型CartSettings检查其中的静态变量,这是问题的根本原因