当前位置: 首页 > 知识库问答 >
问题:

在类中模拟Autowire

潘俊楚
2023-03-14

我有一个在 ABC 中自动连线的 XYZ 类,在类 MyClass 中我有一个方法名称 doSomething() 在该方法中我做 ABC abc = 新的 ABC();然后我调用 abc.someMethod();

请参见下面的代码示例:

ABC类

public class ABC {

  @Autowire
  private XYZ xyz;

  public void someMethod()
  {
   //Some stuff
   xyz.someFunc();

  }
}

类MyCLass

public class MyCLass {

  public void doSomething() {
    ABC abc = new ABC();
    abc.someMethod();
  }
}

需要单元测试doSomething(),但我NPE在ABC中XYZ为空。在这种情况下,我怎么能模仿@Autowire。

共有2个答案

巴英韶
2023-03-14

可以在测试中使用以下测试功能:

import org.springframework.context.annotation.Configuration;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

提供配置并使用它,例如:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyTest.MyTestConfiguration.class)
public class MyTest {

    // xyz injected into ABC and MyTest for convenience.
    @Autowired
    private XYZ xyz;

    @Test
    public void myTest() {
        // Some Stubbing...
        when(xyz.trySomething()).thenReturn(true);

        // Some verification.
        new ABC().doSomething();
        verify(xyz, times(1))
                .trySomething();
    }

    // Note it is used in @ContextConfiguration
    @Configuration
    static class MyTestConfiguration {
        @Bean
        XYZ xyz() {
            return mock(XYZ.class);
        }
    }
}

文档有点广泛,请在此处搜索提到的注释 https://docs.spring.io/spring-framework/docs/current/reference/html/testing.html#integration-testing

叶书
2023-03-14

如果使用构造函数注入而不是字段注入,则可以创建mock并将其交给ABC的构造函数:

public class ABC {

    private final XYZ xyz;

    public ABC(XYZ xyz) {
        this.xyz = xyz;
    }

    public void someMethod()
    {
        //Some stuff
        xyz.someFunc();

    }
}

然后在测试中,当您创建被测试的实例时,只需创建它并移交mock:

XYZ mock = mock(XYZ.class);

ABC underTest = new ABC(mock);
 类似资料:
  • 问题内容: 我正在开发一个Web应用程序,该应用程序显然在iOS设备中存在问题。问题是我不拥有iOS设备,而是在Linux Ubuntu中进行开发。我正在寻找一种在Linux(尤其是浏览器)中仿真/模拟此OS的方法,但是还没有找到任何东西。 到目前为止,我发现的是iOS SDK的Simulator,但这是针对Mac的。还有一些Windows模拟器。有人做过吗? 问题答案: 我能想到的唯一解决方案是

  • 问题内容: 我在源代码中使用了BufferedWriter对象 我正在尝试在我的测试用例中模拟它,如下所示: 但是,BufferedWriter不会被嘲笑,它总是进入实际的实现中。是因为它不能模拟BufferedWriter,因为它是一个具体的类吗?这是否意味着无法模拟任何java.io类?有没有办法模拟它,或者我做错了什么? 问题答案: ,你可以嘲笑的Java IO类(包括它们的构造,所以未来的

  • 问题内容: 我正在尝试模拟DateTimeFormatter类。我已经完成以下工作: 用它格式化。然后,格式化的字符串将进一步用于生成另一个字符串。我需要确保正确生成字符串。因此,我需要从格式化程序返回一个一致的日期,或者模拟LocalDateTime.now(..)静态方法 我究竟做错了什么? 问题答案: 模拟的替代方法是将时钟注入您的类并更改您的(或添加另一个)构造函数,如下所示: 然后在您的

  • Alpha-父级,子级为beta 贝塔-阿尔法的孩子,查理 Charlie-有一个列表,通常在制作中会被洗牌 AlphaTest[需要此测试的帮助]-想尝试不同的洗牌变体,看看alpha/beta会如何反应。 目标是用不同的组合测试Alpha/Beta。不知道最好的方法是什么?这正是复制的代码。也可以更改设置以方便测试。尝试了不同的变体,但没有任何效果。非常感谢您的帮助。 我不确定,我尝试了一堆方

  • 问题内容: 对于单元测试,我需要模拟几个依赖项。依赖项之一是实现接口的类: 我需要设置一个此类的模拟对象,当提供一些指定参数时,该对象将返回一些指定值。 现在,我不确定的是,模拟接口或类是否更好 与 在测试方面有什么不同吗?首选的方法是什么? 问题答案: 在您的情况下,可能不会有太大的区别,但是首选的方法是模拟接口,就像通常情况下,如果您遵循TDD(测试驱动开发),那么即使在编写实现类之前,也可以

  • 我有一个scala类a,其中有一个方法。 还有一个B类