Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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 为什么@Spy Abc无法获取已经存在的实例?_Java_Junit_Mockito - Fatal编程技术网

Java 为什么@Spy Abc无法获取已经存在的实例?

Java 为什么@Spy Abc无法获取已经存在的实例?,java,junit,mockito,Java,Junit,Mockito,我有一个junit测试用例,其中我以以下方式使用了Spy Junit在以下情况下失败 @Spy private Abc abc; 但是它成功地运行了 @Spy Abc abc = new Abc(); 有人能解释一下为什么吗?另外,在这份声明中, @Spy Abc=new Abc() 是创建新实例还是使用现有实例 也就是说,当使用@Spy注释时,Mockito会将现有实例包装到Spy对象中。@Spy注释的工作原理与以下代码类似: Abc spyAbc = Mockito.spy(new

我有一个junit测试用例,其中我以以下方式使用了Spy Junit在以下情况下失败

@Spy
private Abc abc;
但是它成功地运行了

@Spy  Abc abc =  new Abc(); 
有人能解释一下为什么吗?另外,在这份声明中,
@Spy Abc=new Abc()
是创建新实例还是使用现有实例

也就是说,当使用
@Spy
注释时,Mockito会将现有实例包装到Spy对象中。
@Spy
注释的工作原理与以下代码类似:

Abc spyAbc = Mockito.spy(new Abc());
这意味着,这两个表达式将产生相同的结果:

@Spy Abc abc = new Abc();
Abc abc = Mockito.spy(new Abc());
以下语句仅在存在默认构造函数时有效:

@Spy Abc abc;
使用spies,spy对象的行为与原始实现相同(尽管您可以使用

Mockito.doReturn(1).when(abc).myMethod();
相反,使用mock对象(
Mockito.mock(Abc.class)
)不会提供与原始实现相同的行为,因为它不是类的真实实例

当您想监视spring Bean时,必须采取以下可能的方法:

像这样使用
@SpyBean
(请参阅:):

@SpyBean
private Abc abc;
或者结合使用
@Autowired
@Spy

@Spy
@Autowired
private Abc abc;

这两种方法都会起作用。请注意
when(abc.method())。然后返回(1);
doReturn(1)。when(abc.method();
。只有在第一种情况下才实际调用了
方法()
(并且只修改了返回)。对于第二个示例,将不调用该方法。此差异对于了解该方法是否有副作用非常重要。

使用
@Spy
注释时,Mockito将在Spy对象中包装现有实例。
@Spy
注释的工作原理与以下代码类似:

Abc spyAbc = Mockito.spy(new Abc());
这意味着,这两个表达式将产生相同的结果:

@Spy Abc abc = new Abc();
Abc abc = Mockito.spy(new Abc());
以下语句仅在存在默认构造函数时有效:

@Spy Abc abc;
使用spies,spy对象的行为与原始实现相同(尽管您可以使用

Mockito.doReturn(1).when(abc).myMethod();
相反,使用mock对象(
Mockito.mock(Abc.class)
)不会提供与原始实现相同的行为,因为它不是类的真实实例

当您想监视spring Bean时,必须采取以下可能的方法:

像这样使用
@SpyBean
(请参阅:):

@SpyBean
private Abc abc;
或者结合使用
@Autowired
@Spy

@Spy
@Autowired
private Abc abc;

这两种方法都会起作用。请注意
when(abc.method())。然后返回(1);
doReturn(1)。when(abc.method();
。只有在第一种情况下才实际调用了
方法()
(并且只修改了返回)。对于第二个示例,该方法将不会被调用。这个差异对于知道该方法是否有副作用非常重要。

这不是我的问题,这不是测试的最佳解决方案。这不是我的问题,这不是测试的最佳解决方案。@Stephen所以@Spy pri基本上没有区别vate Abc;和@Spy Abc=new Abc();?如果是,为什么输出不同?我刚刚看到我遗漏了你问题中的
自动连线部分。你这是什么意思?你能展示一下你的完整测试设置吗?这样写@Spy private Abc Abc是不对的吗?一般来说,它的工作原理是一样的(通过自动调用默认构造函数->默认构造函数必须存在)如这里所述:。我怀疑在您编写“或者它使用的是自动连接的现有实例”时,测试设置/环境还有其他问题.你能分享一下代码吗?我正在为之编写junit的代码说Xyz类依赖于Abc类,所以在Xyz类中,我自动连接了Abc类的实例Abc。我只是想知道@Spy Abc Abc=new Abc();是探测现有的还是创建新的,这就是我写这篇文章的原因“还是在使用自动连接的现有实例”@Stephen所以@Spy private Abc和@Spy Abc=new Abc()基本上没有区别?如果是,为什么输出不同?我刚才看到我遗漏了你问题中的
自动连线部分。这是什么意思?你能展示一下你的完整测试设置吗?这样写@Spy private Abc不正确吗?一般来说,它的工作原理是一样的(通过自动调用默认构造函数->默认构造函数必须存在)如这里所述:。我怀疑在您编写“测试设置/环境”时有更多的内容,还是使用了自动连接的现有实例“。你能分享一下代码吗?我正在为之编写junit的代码说Xyz类依赖于Abc类,所以在Xyz类中我有自动连接的Abc类实例Abc。我只是想知道@Spy Abc Abc=new Abc();是探测现有的还是创建新的,这就是我写这个的原因。”“还是使用自动连线的现有实例”