【问题标题】:Mocking static methods objects with Mockito/powermock使用 Mockito/powermock 模拟静态方法对象
【发布时间】:2021-04-17 10:00:00
【问题描述】:

我有一个 DistributionRule 类,其中包含私有 Set 分布;

@Getter
@Setter
public class DistributionRule extends BaseModel {

    private String ruleName;
    private String skuId;
    private String catalogueId;
    private String categoryId;
    private Boolean active;
    private RuleLevel level;
    private Set<Distribution> distributions;
    private Double thresholdValue;
    private RuleType ruleType = RuleType.GENERAL;

    @Getter
    @Setter
    public static class Distribution {
        private String consumerId;
        private Double distribution;
    }

}

在RuleServiceImpl中有一个获取DistributionRule列表的方法:

    @Override
    public List<DistributionRule> getDistributionRules() {
        return ruleRepository.findAll();
    }

在 DivRuleApplicationTests 类中:

@RunWith(SpringRunner.class)
@SpringBootTest
class DivRuleApplicationTests {

    @Autowired
    private RuleServiceImpl ruleServiceImpl;
    
    @MockBean
    RuleRepository ruleRepository;
    
    @Test
    void test() {
        assertTrue(true);
    }
    
    @Test
    public void getDistributionRulesTest(){
        Set<Distribution> distributions = new HashSet();
        when(ruleRepository.findAll()).thenReturn(Stream
                .of(new DistributionRule("rule0010", "0010", " ", " ", true, "SKU", ""), 
                    new DistributionRule("rule0020", "0020", "", "", true, "SKU", ""))
                .collect(Collectors.toList()));
        assertEquals(2, ruleServiceImpl.getDistributionRules().size());
        
    }

}

如何在 Stream.of() 中传递“分布”值?

【问题讨论】:

  • 为什么不用setter传递呢? (假设你不能用构造函数传递它)

标签: junit static mocking mockito powermockito


【解决方案1】:

首先,您尝试在when 上模拟的方法返回List&lt;DistributionRule&gt;。在这种情况下,您无需创建Stream.of(new DistributionRule(...)),然后将其收集为列表。只需使用List.of(new DistributionRule(...)),因为它会返回您想要的列表。

其次,您应该使用 @AllArgsConstructor 注释 DistributionRule 和内部类 Distribution 以生成带有所有参数的构造函数。这将允许您创建一个 DistributionRule 对象,并将 Distribution 设置为参数:

@Test
public void getDistributionRulesTest(){
    Set<Distribution> distributions1 = Set.of(
        new Distribution(...), new Distribution(...)
    );

    Set<Distribution> distributions2 = Set.of(
        new Distribution(...), new Distribution(...)
    );

    when(ruleRepository.findAll()).thenReturn(List.of(
       new DistributionRule("rule0010", "0010", ..., distributions1, ..), 
       new DistributionRule("rule0020", "0020", ..., distributions2, ...)
    ));

    assertEquals(2, ruleServiceImpl.getDistributionRules().size());
}

PS:我通常使用@Data 注释而不是@Getter@Setter,因为它是该注释和其他注释的快捷方式。想了解更多可以看这里:https://projectlombok.org/features/Data

【讨论】:

  • ? 也考虑改变你的模型。我不明白为什么分发类需要是静态的。
猜你喜欢
  • 2014-02-03
  • 1970-01-01
  • 2015-11-04
  • 2014-08-30
  • 2014-02-02
相关资源
最近更新 更多