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

等待性和@SpyBean不工作的Spring Boot集成测试,因为@SpyBean总是空的

法烨华
2023-03-14

我想测试我预定的任务,所以我遵循了本教程

@SpringJUnitConfig(SchedulerConfig.class)
public class MailJobFinderTaskIT {

    @SpyBean
    private MailJobFinderTask mailJobFinderTask;

    @Test
    public void whenWaitThreeSecond_ThenTaskCalledThreeTimes(){
        await()
            .atMost(Duration.ofSeconds(3))
            .untilAsserted(() -> verify(mailJobFinderTask, atLeast(3)).findEmailJobs());
    }

}

但实际上它不工作,因为下面的错误

 org.mockito.exceptions.misusing.NullInsteadOfMockException:
        Argument passed to verify() should be a mock but is null!
        Examples of correct verifications:
        verify(mock).someMethod();
        verify(mock, times(10)).someMethod();
        verify(mock, atLeastOnce()).someMethod();
        not: verify(mock.someMethod());
        Also, if you use @Mock annotation don't miss initMocks()

这是我任务课的签名

@Component
public class MailJobFinderTask extends SuppressedLogPoller {
....
}

 @Scheduled(fixedRate = 1000)
 public void findEmailJobs() {
 .
 .
 }

我已经尝试将注释更改为@SpringBootTest,并尝试使用@MockBean而不是@SpyBean,但没有成功。事实上,我不明白为什么我的bean mail JobFinder任务没有创建

共有1个答案

严兴旺
2023-03-14

你的代码在我的系统上似乎运行良好,但我不得不做一些修改

我建议您将这些作为故障排除的起点。此外,您还没有提到是否可以成功复制链接教程,该教程在我的系统上也运行良好。如果你还没有,我建议你先试试这个教程,确认它是有效的,然后再添加你自己的代码。

如果下面的内容对您没有帮助,那么问题可能不在您发布的代码部分。在这种情况下,共享完整代码将帮助我们更好地解决问题。但就目前而言,可能需要特别注意以下列出的进口声明和主要变化。

代码的更改

  1. 我将Duration.of秒(3)方法更改为持续时间。FIVE_SECONDS。这样做的原因是前者来自java.time包,而wait()期望一个持续时间类来自awai力包。我只是出于兼容性的目的使用FIVE_SECONDS。
  2. 我必须删除扩展的SubpressedLogPoller部分,因为我没有访问这个类的权限。我还建议删除它并再次添加它,看看是否是它导致了这个问题。

测试类代码

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.mock.mockito.SpyBean;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;


import org.awaitility.Duration;

import static org.awaitility.Awaitility.await;
import static org.mockito.Mockito.atLeast;
import static org.mockito.Mockito.verify;


@SpringJUnitConfig(ScheduledConfig.class)
public class MailJobFinderTaskIT {

    @SpyBean
    private MailJobFinderTask mailJobFinderTask;

    @Test
    public void whenWaitThreeSecond_ThenTaskCalledThreeTimes(){
        await()
                .atMost(Duration.FIVE_SECONDS)
                .untilAsserted(() -> verify(mailJobFinderTask, atLeast(7)).findEmailJobs());
    }
}

域类

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MailJobFinderTask {

    @Scheduled(fixedRate = 1200)
    public void findEmailJobs() {

    }

}
 类似资料:
  • 我试图使用Mockito的Spy部分模拟一个服务,重写一个方法,使其返回一致的数据进行测试,但Say Spy无缘无故抛出一个UnfinishedStubbingException。 这是我的测试类: 这两个测试都失败了,指向指向

  • 我的等待块应该测试我的托盘架是否有足够的空间来存储我的托盘。所以当我有20个托盘,我的商店有15个空间,15个应该储存,其他5个托盘应该在我的等待块等待,直到托盘架再次有空间。问题是我得到一个错误,没有空单元格,这意味着没有空间的托盘不在我的块中等待,而是通过等待块,这导致了一个错误。问题出在哪里?等待块和机架截齿是附加的。 球拍 误差

  • 已删除MyTestConfig.class,但问题仍然相同。即使我使用@SpringBootTest(classes={Application.Class,MyProblematicServiceImpl.Class}),它仍然在自动连线的地方返回模拟对象。MyProblematicServiceImpl是用@Service注释的空类。

  • 我在Unity中制作了一个2d游戏,我正在使用此代码实例化敌人 在这段代码中,IENumator方法正在执行它们的工作,但没有产生返回新的WaitFor秒。意味着如果我在Unity中运行它,敌人会在每一帧中实例化。我该怎么解决呢?

  • 尽管我的测试方法被@WithMockUser注释,但我仍然被拒绝访问。为什么这在集成测试中不起作用?使用@webappconfiguration和mockmvc进行测试一切都很好。