【问题标题】:MessageSource not being read properly during testing测试期间未正确读取 MessageSource
【发布时间】:2017-01-16 10:18:06
【问题描述】:

我已经检查了大多数类似的问题,但找不到有用的答案。

我正在使用 Maven v3.3.9 通过 JHipster 创建一个 WebApplication。除其他外,还发生了 PDF 生成。该网络应用程序是多语言的,并使用

/resources/i18n/..

不同翻译的资源文件。在现场测试中,一切都完美无缺,没有问题或错误。

我现在正在尝试创建一个测试,该测试将生成 PDF 并将其与现有 PDF 进行比较,以便可以继续开发。问题是,无论我使用哪种语言环境进行测试,都会出现相同的错误:

我不确定错误的原因是什么。由于消息在那里并且在实时测试期间它们完美地工作。

这里是测试代码:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = DeviceDataCheckApp.class)
public class PDFGeneratorTest
{
private MockMvc mockMvc;

private CalculationMapperImpl calculationMapperImpl;

private Calculation calculation;
private CalculationDTO calculationDTO;
private CalculationResult calculationResult;
private String langval = "de";
private String name = "";

private PDFGenerator pdfGenerator;

@Autowired
private MessageSource messageSource;

@Autowired
private WebApplicationContext webApplicationContext;

@Before
public void setup() throws IOException, URISyntaxException, IllegalAccessException, InstantiationException
{
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();

    calculation = new Calculation()
            .producerName("test")
            .airVolumeSupply(2.0)
            .airVolumeExhaust(2.0)
            .statedAirVelocitySupply(2.0)
            .statedAirVelocityExhaust(2.0)
            .staticPressureLossSupply(2.0)
            .staticPressureLossExhaust(2.0)
            .pMSupply(2.0)
            .pMExhaust(2.0)
            .pMAnfSupply(2.0)
            .pMAnfExhaust(2.0)
            .pressureLossWrgSupply(2.0)
            .pressureLossWrgExhaust(2.0)
            .pressureLossMediumSupply(2.0)
            .pressureLossMediumExhaust(2.0)
            .enginePowerRotor(0.0)
            .dryThermalPerformance(0.0)
            .ofHeatRecovery(2.0)
            .wrgType(WrgType.PLATTENTAUSCHER)
            .earlyPressureLossFilterSupply(2.0)
            .earlyPressureLossFilterExhaust(2.0)
            .dimensioningPressureLossFilterSupply(2.0)
            .dimensioningPressureLossFilterExchaust(2.0)
            .referenceConfigurationFilterSupply(false)
            .referenceConfigurationFilterExhaust(false)
            .additionalFilterStageSupply(false)
            .additionalFilterStageExhaust(false)
            .hepaFilterSupply(false)
            .hepaFilterExhaust(false)
            .gasFilterSupply(false)
            .gasFilterExhaust(false)
            .highPerformanceCondenserSupply(false)
            .highPerformanceCondenserExhaust(false)
            .heightInnerDimensionSupply(2.0)
            .heightInnerDimensionExhaust(2.0)
            .depthInnerDimensionSupply(2.0)
            .depthInnerDimensionExhaust(2.0);

    calculationMapperImpl = new CalculationMapperImpl();
    calculationDTO = calculationMapperImpl.calculationToCalculationDTO(calculation);

    calculationResult = new CalculationResult();
    calculationResult.setRealAreaSA(0.00);
    calculationResult.setRealAreaEA(0.00);
    calculationResult.setRealAirVelocitySA(138.89);
    calculationResult.setRealAirVelocityEA(138.89);
    calculationResult.setCheckedVClassSA("V9");
    calculationResult.setCheckedVClassEA("V9");
    calculationResult.setDeclaredVClassSA("V4");
    calculationResult.setDeclaredVClassEA("V4");

    calculationResult.setpMRefSA(0.00);
    calculationResult.setpMRefEA(0.00);
    calculationResult.setpMMaxSA(0.00);
    calculationResult.setpMMaxEA(0.00);
    calculationResult.setpClassSA("-");
    calculationResult.setpClassEA("-");

    calculationResult.setPressureLossWrg(4);
    calculationResult.setPressureLossMedium(0);
    calculationResult.setRatedAirVolume(2);
    calculationResult.setDryThermalPower(0.00);
    calculationResult.setAuxiliaryPower(0.00);
    calculationResult.setElectricalPowerInput(0.00);
    calculationResult.setPerformanceReferenceNumber(72.29);
    calculationResult.setEfficiency(1.97);
    calculationResult.sethClass("H6");

    calculationResult.setpSfpVSA(3600000.00);
    calculationResult.setpSfpVEA(3600000.00);
    calculationResult.setExtraPSfpSA(0);
    calculationResult.setExtraPSfpEA(0);
    calculationResult.setSfpVClassSA("SFP7");
    calculationResult.setSfpVClassEA("SFP7");

    calculationResult.setSystemEfficiencySA(0.00);
    calculationResult.setSystemEfficiencyEA(0.00);

    calculationResult.setInternalPressureLossSA(2);
    calculationResult.setInternalPressureLossEA(2);
    calculationResult.setInternalPressureLossTotal(4);
    calculationResult.setSfpIntSA(3600000);
    calculationResult.setSfpIntEA(3600000);
    calculationResult.setSfpIntTotal(7200000);

    calculationResult.seteBonus2016(0);
    calculationResult.seteBonus2018(0);
    calculationResult.setfCorrection2016(360);
    calculationResult.setfCorrection2018(340);
    calculationResult.setSfpMax2016(840);
    calculationResult.setSfpMax2018(760);
    calculationResult.setAchieved2016(false);
    calculationResult.setAchieved2018(false);



    pdfGenerator = new PDFGenerator(calculationDTO, calculationResult, langval, messageSource, name);
}

@Test
public void compareFilesTest() throws IOException
{
    System.out.println(calculation);

    File f1 = new File("../PDFData/testPDF.pdf");
    File f2 = new File("../PDFData/testPDF2.pdf");

    boolean areSame = FileUtils.contentEquals(f1, f2);
    System.out.println("Files were compared...");
    assertTrue(areSame);

}


}

PDFGenerator 创建 testPDF2.pdf 文件并保存。

更新 添加:

@PropertySource("classpath:/src/main/resources/i18n/messages_de.properties")

对配置没有太大作用。我还从

更改了语言环境
String locale = "de"

Locale locale = Locale.GERMAN;

然后我加入了:

System.out.println(messageSource.getMessage("pdf.klasse", null, this.locale));

直接在测试开始时。我犯了同样的错误。似乎问题不在于找到文件,而在于读取文件。

【问题讨论】:

  • 请删除 pdfbox 标签,这与 pdfbox 无关。

标签: java spring maven jhipster


【解决方案1】:

在您的配置中,您需要:

@Bean
public ResourceBundleMessageSource messageSource() {
    ResourceBundleMessageSource source = new ResourceBundleMessageSource();
    source.setBasenames("i18n/messages");
    return source;
}

我的测试是

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class Test1 {

    @Autowired
    private MessageSource messageSource;

    @Test
    public void test1() {
        assertNotNull(messageSource);
        assertEquals("test greg de", messageSource.getMessage("pdf.klasse", null, Locale.GERMANY));
    }
}

【讨论】:

  • 感谢伙伴的快速回复。我将配置添加到测试中,但无济于事。我认为问题不在于查找文件(因为文件位于 /src/test/resource 和 /src/main/resource 中),但它似乎更像是语言环境,好像文件无论出于何种原因被“读错”......我相信,我正在尝试所有可能的解决方案,并会在我找到答案后立即更新。
  • 非常感谢您指出该 bean。它正在创建一个空消息源(DelegatedMessageSource),这就是 NotNull 测试一直返回 true 的原因。然而,对象本身是空的并且缺少路径。一旦我将 Bean 添加到 Application.java 中,它就可以完美运行。 :) 干杯
【解决方案2】:

我的解决方案。

在测试类中声明 MessageSource 并在测试类中自动装配 DelegatingMessageSource。

private MessageSource messageSource;

@Autowired
private DelegatingMessageSource delegatingMessageSource;

如下图所示创建设置

@Before
public void setUp() {
  messageSource = Mockito.mock(MessageSource.class);
  when(messageSource.getMessage(anyString(), any(Object[].class),any(Locale.class))).thenReturn("");
  delegatingMessageSource.setParentMessageSource(messageSource);
}

它应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-04
    • 2014-08-25
    • 1970-01-01
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2020-05-19
    相关资源
    最近更新 更多