首页 > 解决方案 > 当从 Junit 调用实际方法而不是 test.properties 文件中的值时,从属性文件中获取值的 var 为 null。怎么修?

问题描述

编写测试的方法:

public class SampleClassA {

    @Value("${aws.s3.bucket}")
    private String bucketName;

    public Object retrieveObject(String fileUUID) {
        Object repoDoc = new Object();
        MetaData metaData = getMetaData(fileUUID);
        repoDoc.setDocumentContent(retrieveFileFromS3(AppUtils.getKeyPath(metaData.getPath(), bucketName, fileUUID)));
        return repoDoc;
    }
}

AppUtils 方法:

public final class AppUtils {
    public static String getKeyPath(String path, String bucketName, String fileUUID){        
        if(path.startsWith(bucketName)){
            return (path.replace((bucketName+"/"), "")+"/"+fileUUID);
        } else {
            throw new Exception(ErrorCode.INVALID_PATH);
        }
    }
}

我的 JUnit:

@RunWith(MockitoJUnitRunner.class)
@SpringBootTest(classes = S3DocumentManagerImpl.class)
@EnableConfigurationProperties
@ActiveProfiles("test")
public class SampleClassATest {

    @Value("${aws.s3.bucket}")
    private String bucketName;

    String fileUUID;

    @Spy
    SampleClassA sampleClassA1;

    @InjectMocks
    SampleClassA sampleClassA;

    @BeforeEach
    void setUp() {
    }

    @Before
    public void setup() {
        fileUUID = "TestFileUUID";
        repoObj = new Object();
        metaData = new MetaData();
        bucketName = "testBucket";
    }

    @Test
    public void retrieveObjectSuccessTest() throws Exception {
        metaData = CreateObjectsForEntityStub.createMetaDataModel();
        doReturn(metaData).when(sampleClassA1).getMetaData(fileUUID);
        when(repository.findById(fileUUID)).thenReturn(Optional.of(metaData));
        //Here Bucket Name has Value form application-test.properties
        doReturn(null).when(sampleClassA1).retrieveFileFromS3(AppUtils.getKeyPath(metaData.getPath(), bucketName, fileUUID));
        //When called from below bucketName is null
        repoObj = sampleClassA.retrieveObject(fileUUID);
        assertEquals(repoObj.getRepositoryDocumentId(), fileUUID);
    }
}

当从 Mockito 调用时,bucketName 的值存在并且是从我的 applications-test.properties 中选取的,而当从测试中调用实际方法时,bucketName 为空。这导致我的测试在到达 AppUtils.getKeyPath() 时因空指针异常而失败。如何修复这个单元测试?

标签: javajunitmockitojunit4

解决方案


推荐阅读