3

Web アプリケーションが正常に動作しています。今、私はユニットテストを書こうとしています。私の webapp には次の conversionService があります

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="....Class1ToStringConverter"/>
                <bean class="....StringToClass1Converter"/>
            </list>
        </property>
</bean>
<mvc:annotation-driven  conversion-service="conversionService" />

これはうまく機能し、リクエストを行うと

/somepath/{class1-object-string-representation}/xx 

すべてが期待どおりに機能します (文字列は Class1 オブジェクトとして解釈されます)。

私の問題は、コントローラーに単体テストを書き込もうとしていることです。conversionService は使用されていないだけで、春は教えてくれます

Cannot convert value of type [java.lang.String] to required type [Class1]: no matching editors or conversion strategy found

これまでの私のテスト:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/applicationContext.xml", "file:src/main/webapp/WEB-INF/jpm-servlet.xml"})
@WebAppConfiguration()
public class GeneralTest {

    @Autowired
    private WebApplicationContext ctx;
    private MockMvc mockMvc;
    private TestDAO testDAO = org.mockito.Mockito.mock(TestDAO.class);

    @Before
    public void setUp() throws Exception {
        Mockito.reset(testDAO);
        mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();
    }

@Test
public void testList() throws Exception {
    final Test first = new Test(1L, "Hi", 10, new Date(), true);
    final Test second = new Test(2L, "Bye", 50, new Date(), false);
    first.setTest(second);

    when(testDAO.list()).thenReturn(Arrays.asList(first, second));

    mockMvc.perform(get("/jpm/class1-id1"))
            .andExpect(status().isOk())
            .andExpect(view().name("list"))
            .andExpect(forwardedUrl("/WEB-INF/jsp/list.jsp"));
}

何が欠けていますか?ありがとう

4

4 に答える 4

5

モックコンバーター このように、

  GenericConversionService conversionService = new GenericConversionService();
  conversionService.addConverter(new StringToClass1Converter());



Deencapsulation.setField(FIXTURE, conversionService);
于 2015-10-22T04:44:55.973 に答える
0

これは古いスレッドであることは認識していますが、私のように、カスタム コンバーターが呼び出されない理由のトラブルシューティングに数時間費やした後、将来これに出くわす人もいるでしょう。

@Mariano D'Ascanio によって提案されたソリューションは、Spring JPA を使用している場合のように、コントローラーがまったくない場合、少なくとも作成したコントローラーがない場合には適切ではありません。MockMvcBuilders.standaloneSetup少なくとも 1 つのコントローラーをコンストラクターに渡す必要があるため、そのような場合には使用できません。org.springframework.core.convert.converter.ConverterRegistryそれを回避する方法は、以下に示すように、サブクラスを注入してからorg.springframework.core.convert.converter.FormatterRegistry@PostContructメソッドでカスタムコンバーター/フォーマッターを登録することです。

@PostConstruct
void init() {
    formatterRegistry.removeConvertible(String.class, OffsetDateTime.class);

    formatterRegistry.addFormatter(customOffsetDateTimeFormatter);
    formatterRegistry.addConverter(customOffsetDateTimeConverter);
}

ConverterRegistryWeb テストには、default と mvc の 2 つのコンバーター レジストリがあるため、型ではなく名前を使用してを挿入するのが秘訣です。Spring テストはデフォルトのコンバーターを使用するため、それが必要です。

// GOTCHA ALERT: There's also a mvcConversionService; tests DO NOT use that
@Resource(name = "defaultConversionService")
private FormatterRegistry formatterRegistry;

お役に立てれば。

于 2015-10-22T04:38:26.030 に答える