Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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构造新对象时编写可测试代码_Java_Testing_Mockito - Fatal编程技术网

Java 仅使用Mockito构造新对象时编写可测试代码

Java 仅使用Mockito构造新对象时编写可测试代码,java,testing,mockito,Java,Testing,Mockito,因此,我正在编写一个类,我希望遵循最佳实践并可测试。 我要在里面创建一个新对象。因此,我遵循工厂模式来实现它 public class Apple { // factory object injected in class private SeedFactory seedFactory; // Method to be tested public void myMethod(String property1, int property2, String de

因此,我正在编写一个类,我希望遵循最佳实践并可测试。 我要在里面创建一个新对象。因此,我遵循工厂模式来实现它

public class Apple {
    // factory object injected in class
    private SeedFactory seedFactory; 

    // Method to be tested 
    public void myMethod(String property1, int property2, String depends) { 
        // Just to set the necessary parameter
        seedFactory = new SeedFactory(property1, property2); 
        // Factory pattern intact. Instance generation depends on only one parameter
        SeedFactory result = seedFactory.getInstance(depends); 
    }
}
编辑:也为工厂添加代码

public class SeedFactory{
String property1;
int property2;

SeedFactory(property1,property2){
this.property1 = property1;
this.property2 = property2;
}
SeedFactory getInstance(int depends){
if(depends == 1)
{ // do stuff }
else{ // do stuff and return instance }
现在,在我实际创建新对象之前,我必须确保我为要生成的新实例设置了两个属性,无论工厂生成的实例类型如何,这些属性都需要存在
Dependes
是实际参数,告诉工厂返回哪个实例

现在,就这段代码的可测试性而言,我可以使用用户
PowerMockito
在新的
whenNew
时模拟工厂对象,但使用PowerMockito不是一种选择。我必须让它在没有它的情况下可以测试

此外,我还尝试将
new
调用封装在一行函数中,然后使用
spy
。但是我想避免使用
spy
,因为它被认为不是一个好的实践,因为在整个代码使用的上下文中

所以我的问题是,在不使用PowerMockito的情况下,有没有办法重新编写这个类,以便能够正确地进行单元测试


如果要生成的实例只需要一个参数,那么它将是微不足道的。但是,我不想将多个参数传递给
getInstance()

SeedFactory
不是苹果的依赖关系,而是您的方法依赖于具有“使用”关系的
SeedFactory
。因此,为了定义适当的关系,我建议您使用“使用”关系,如下所示:

public void myMethod(SeedFactory seedFactory, String depends){ // Method to be tested 

现在,您可以模拟种子工厂,并对其进行适当的单元测试。

我认为您做错了什么

如果
SeedFactory
不是
Apple
的依赖项,而是内部问题,那么您不需要模拟
SeedFactory
来测试
Apple
。您应该只测试Apple提供的公共API


如果
SeedFactory
是一个
Apple
的依赖项,那么它肯定应该被注入。

SeedFactory
是我需要模拟和注入的一个。听起来好像你真的想注入一个SeedFactoryFactory。顺便说一句,在Java中,将类的名称大写被认为是一种最佳实践。我觉得这段代码很混乱。您需要3个属性来构建一个有效/有用的SeedFactory实例,因此您创建了一个具有2个属性的无效/无用实例(可能是bug的来源),并使用它(如David Wallace所指出的SeedFactory)来创建具有第3个属性的有效实例。为什么不使用一个具有3个属性的构造函数,或者使用生成器模式逐个添加所有需要的属性呢?另外,您不需要对
结果执行任何操作
——我假设这是为了简洁起见而进行的编辑,但它不太清楚您真正需要模拟的内容。那么,我应该在哪里构建通过的
种子工厂
?一级顶部。无论谁是我的方法的消费者。对不起,我没有完全理解你的观点,所以我添加了工厂的定义。请查看编辑。现在,方法的使用者需要自己直接调用工厂的构造函数吗?