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

Junit/Spring Boot模拟类

荆学民
2023-03-14

我使用Spring Initializr生成了一个Spring Bootweb应用程序,使用嵌入式Tomcat+Thymeleaf模板引擎,并将其打包为一个可执行的JAR文件。

@ContextConfiguration(classes={TestPersistenceConfig.class})
@RunWith(SpringRunner.class)
@SpringBootTest
public class JdbcRemoteUnitRepositoryTests {

    @Autowired
    private JdbcRemoteUnitRepository repository;

    @Autowired
    @InjectMocks
    private SmsConfig smsConfig;

    @Autowired
    @InjectMocks
    private NextelSMSSender  smsService;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);
    }

    @Test   
    public void testGetAllUnits() throws DataAccessException, SQLException {        
        Assert.assertTrue(true);
    }

}

类NexTelsMSSender:

@Service("smsService")
public class NextelSMSSender  {

    public final static String OK_STATUS_CODE = "200";

    @Autowired
    SmsConfig smsConfig;
..
}

.

@Configuration
@PropertySource("sms-gateway.properties")
public class SmsConfig {

    @Value("${sms.domainId}")
    private String domainId;

    @Value("${sms.gateway.url}")
    private String gatewayUrl;
..
}

但这似乎并不是在嘲弄对象属性,因为当我打包应用程序时。我有一个错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Field smsConfig in com.plats.bruts.NextelSMSSender required a bean of type 'com.plats.bruts.config.SmsConfig' that could not be found.

Action:

Consider defining a bean of type 'com.plats.bruts.config.SmsConfig' in your configuration.
The annotation @Bean is disallowed for this 
 location

    @Configuration
    @Bean
    public class TestSmsConfig {

        @Value("fake.domainId")
        private String domainId;

        @Value("fake.sms.gateway.url")
        private String gatewayUrl;

         ...
}

共有1个答案

夏元明
2023-03-14

您正在自动生成smsConfig,但似乎没有在测试应用程序上下文中提供@bean。

此外,您不正确地使用了@InjectMocks-这应该用于将模拟对象注入到测试中的类(您的NextelSMSSender类,而不是SmsConfig)中。

要解决这个问题,请在配置类中添加一个@bean方法,以提供SmsConfig bean实例。

有关更多信息,请参见弹簧引导测试功能的第41.3.4节:

Spring Boot包含一个@mockbean注释,可用于为ApplicationContext中的bean定义一个Mockito模拟。您可以使用注释添加新的bean,或者替换单个现有的bean定义。注释可以直接用于测试类、测试中的字段或@Configuration类和字段。在字段上使用时,创建的mock的实例也将被注入。模拟豆在每次测试方法后自动重置。

 类似资料:
  • 当我尝试用PowerMock和Mockito测试一个方法并模拟它的依赖关系时遇到了问题。我尝试将依赖关系方法转换为非静态方法,并使用@mock注释和@injectmocks,但没有任何结果。 下面是正在测试的类和方法: 这里有一个我想要嘲弄的依赖关系,我很难嘲弄它: 最后,但不是最不重要的是,使用失败的测试方法的测试类。我不得不说,它甚至没有到达assert方法调用,而是在when().ThenR

  • 本节介绍与JUnit Framework相关的各种模拟测试。 您可以在本地计算机上下载这些示例模拟测试,并在方便时离线解决。 每个模拟测试都提供一个模拟测试密钥,让您自己验证最终得分和评分。 JUnit Mock Test I 问题1 - 以下哪项描述正确测试? A - 测试是检查应用程序功能的过程,是否按照要求运行。 B - 测试是单个实体(类或方法)的测试。 C - 以上两者。 D - 以上都

  • 我试图编写一些基本的backingBean测试,但我一直在模仿UserContext和facesContext。 此代码在我尝试测试的代码中: 在另一段代码中,我得到了以下内容: 如何在标准jUnit测试中仅使用mockito来模拟这些?还是必须使用PowerMock之类的工具?

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

  • 问题内容: 我有一个Java命令行程序。我想创建JUnit测试用例以进行模拟。因为当我的程序运行时,它将进入while循环并等待用户输入。如何在JUnit中模拟呢? 问题答案: 从技术上讲,可以进行切换,但是总的来说,不直接在代码中调用它,而是添加一层间接层,这样输入源就可以从应用程序的某个位置进行控制,这样会更健壮。确切地讲,这是实现的详细信息-依赖项注入的建议很好,但是你不一定需要引入第三方框

  • 在我的实现类中,我有一个读写锁定义,如下所示, 我在一个名为的方法中使用它, 正如我所说的,是null,但是rwLock是初始化的。请解释Mockito是如何发生这种情况的。理想的方法是什么?