簡體   English   中英

Spring 引導(REST 服務)集成測試因 null 指針異常而失敗

[英]Spring Boot (REST Service) Integration tests fail with a null pointer exception

我正在為我的 REST API 編寫集成測試。

以下是課程。

由於 null 指針異常,測試失敗。 當我設置調試斷點並檢查時,我看到在 class CategoryConfiguration中, this.categoryConfigurationProperties.getValuesFromProperties()行返回null

如何確保CategoryConfigurationProperties在測試中正確初始化並從application-category.yml文件加載值。

@RestController
public class MyController {
    @Autowired
    MyService myService;
    
    public ResponseEntity<MyResponse> createProduct(...) {
        myService.createProduct(...);
        ...
        return...;
    }
}
    

@Service
public class MyServiceImpl implements MyService {
    @Autowired
    MyProductHelper myProductHelper;
    
    public Product createProduct(...) {
        Category category = myProductHelper.getCategory(...);
        ...
    }
    ...
}
    
    
@Component
public class MyProductHelper {
    @Autowired
    @Qualifier("productCategoryMap")
    private Map<Product, Category> productCategoryMap;
    
    public Category getCategory(...) {
        return productCategoryMap.get(...);
    }
}
    
@Configuration
@EnableConfigurationProperties(CategoryConfigurationProperties.class)
public class CategoryConfiguration {
    private final CategoryConfigurationProperties categoryConfigurationProperties;
    
    public CategoryConfiguration(CategoryConfigurationProperties categoryConfigurationProperties) {
        this.categoryConfigurationProperties = categoryConfigurationProperties;
    }
    
    @Bean(name = "productCategoryMap")
    public Map<Product, Category> productCategoryMap() {
        this.categoryConfigurationProperties.getValuesFromProperties();
        ...
        return ...;
    }
    ...
}
    
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "my-config")
@AllArgsConstructor
@Getter
public class CategoryConfigurationProperties {
    Map<String,Map<String,List<String>>> valuesFromProperties;
}
    
    
@ExtendWith({SpringExtension.class,MockitoExtension.class})
@SpringBootTest(classes = {MyApplication.class},webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = CategoryConfiguration.class)
@ActiveProfiles(profiles = "test")
@AutoConfigureMockMvc
@TestPropertySource(properties = {"spring.config.location=classpath:application-category.yml,classpath:application.properties"})
class MyControllerIntegrationTest {
    @Autowired
    private MockMvc mockMvc;
    
    @Autowired
    WebApplicationContext webApplicationContext;
    
    @MockBean
    CategoryConfiguration categoryConfiguration;
    
    @BeforeEach
    public void setup() {
        ...
    }
    
    @Test
    void testCreateProduct() {
        MvcResult result = mockMvc.perform(...);
        // assert
    }
}

我剛剛在我的項目中解決了同樣的問題。

如何測試從 yaml 讀取的外部化配置

看一看,尤其是使用的注解,需要找到合適的組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM