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

@PostContruct方法不适用于Mockito

阙沛
2023-03-14

您好,我正在尝试使用PostConstruct方法初始化字段,但在测试中,此方法不会填充bidiMap字段。

有没有办法模拟bidiMap字段,它是DataSource的字段?

@Component
@Getter
@Setter
@NoArgsConstructor
public class DataSource {

    public DualHashBidiMap<String, String> bidiMap = new DualHashBidiMap();

    @PostConstruct
    public void loadData() throws IOException {
        Map<String, String> data = new ObjectMapper().readValue(new File("src/main/resources/static/data.json"), Map.class);
        data.entrySet().stream().forEach(item -> this.bidiMap.put(item.getKey(), item.getValue()));
    }
}

测试:

@Test
    void shouldReturnPrettifiedUrl_WithQueryParams() throws IOException {
        // Given
        List<String> inputParameters = Arrays.asList("/products?gender=female&tag=123&tag=1234");
        HashMap<String, String> expectedResult = PrettyUrlResponseBuilder.PrettyUrlResponseBuilder().createPrettyUrlResponseWithParams();
        HashMap<String, String> databaseResponse = DatabaseResponse.DatabaseResponse().createDatabaseResponse();
        System.out.println(dataSource);
        // When
        Map<String, String> actualResult = prettyUrlService.toPretty(inputParameters);

        // Then
        assertEquals(expectedResult, actualResult);
    }

正在测试的类:

@Service
public class PrettyUrlService {
    private final DataSource dataSource;

    public PrettyUrlService(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public Map<String, String> toPretty(List<String> urlList) throws IOException {
        var data = dataSource.getBidiMap(); // Here, data is null.
        // ...
    }
}

共有1个答案

长孙作人
2023-03-14

如果您正在单元测试PrettyUrlService类,那么您不需要在同一测试中也测试底层的数据源类。只需模拟数据源的交互并验证所有预期的交互都在发生就足够了。

例如(假设JUnit 5):

@ExtendWith(MockitoExtension.class)
class PrettyUrlServiceTest {

  @Mock
  private DataSource dataSource;
  private PrettyUrlService prettyUrlService;

  @BeforeEach
  void setUp() {
    prettyUrlService = new PrettyUrlService(dataSource);
  }

  @Test
  void exampleTest() {
    DualHashBidiMap<String, String> bidiMap = new DualHashBidiMap();
    // add test data to the map
    bidiMap.put("testKey", "testValue"); // replace with data you need for test
    Mockito.when(dataSource.getBidiMap()).thenReturn(bidiMap);
    
    // insert test logic here (prettyServiceUrl call + assertions)
    // ...

    // finally, verify that dataSource.getBidiMap() was called exactly once
    Mockito.verify(dataSource).getBidiMap();
  }

}
 类似资料:
  • 起初,我在使用< code>writeAndFlush(...)直到我偶然发现了这个修复。现在,我已经可以使用< code>writeAndFlush(...)每个字符串都带有后缀/r/n。当我尝试发送< code>ByteBuf对象时,问题仍然存在。显然,我不能只在消息末尾添加/r/n。对此有什么解决办法吗? 如果有帮助,我将使用

  • 问题内容: 由于某些原因,当我尝试从BytesIO流制作图像时,它无法识别该图像。这是我的代码: 以及它引发的错误的堆栈跟踪: 我正在使用PIL的Pillow实现。 问题答案: 将BytesIO视为文件对象,在完成图像写入后,文件的光标位于文件的末尾,因此当尝试调用时,它将立即获得EOF。 您需要添加一个经过之前到。

  • 下面是我的自定义注释。 我想用“MyAnnoation”做点什么,所以我声明了和如下方法。 下面的服务被其他类“自动安装”。所以我认为这不是与AOP代理相关的问题。 下面的代码调用上面的服务 如果将注释到一个类,则会调用procedure(),但如果一个方法带有类似于上述代码的注释,则该方法不起作用。我希望它只使用方法。 我想解决什么?

  • 我最近开始缓存一个方法的结果。我使用@Cacheable和@CachePut来实现所需的功能。 但不知何故,save操作并没有更新findAll方法的缓存。以下是相同的代码段: 对于findAll方法的第一个调用,它将结果存储在“persons”缓存中,对于所有后续调用,它将返回相同的结果,即使在两者之间执行了save()操作。 我对缓存很陌生,所以任何关于这方面的建议都会很有帮助。 谢谢

  • 问题内容: 我尝试使用JLabel’s之后尝试在屏幕上绘制图像,现在正在尝试paintComponent方法。我在看不到任何结果并且该方法没有被调用之后尝试插入断点,并且什么也没有出现。我该怎么办?这是我的重要代码- ` 另外,如果有区别,我正在使用JFrame而不是JPanel或组件。 问题答案: 没有方法。您应该避免直接绘制到框架上,而应使用和覆盖其方法 您还应该使用@Override批注,如

  • 我对java“I get this error”不熟悉,找不到适合getText(String)方法JTextComponent的方法。getText(int,int)不适用(实际参数列表和形式参数列表长度不同)方法JTextComponent。getText()不适用 (Alt Enter显示提示)“当我试图运行我的程序时。请帮助。我做错了什么?