У меня есть класс, какКак изменить значение «частной статической конечной строка Filepath» для модульного тестирования
public class MappingLoader
{
private static final String filepath = "/tmp/mapping.properties" // unix path of production system
private static Map<String,String> mapping = new HashMap<String,String>()
static
{
loadMappingFile()
}
@VisibleForTesting
static void loadMappingFile()
{
//reading properties files here
final Properties prop = new Properties();
try (final InputStream input = Files.newInputStream(Paths.get(filepath)))
{
prop.load(input);
}
catch (final Exception e)
{
...
...
throw new RuntimeException(e);
}
//now load "mapping" from properties file
....
....
}
}
Для тестирования, мне нужно изменить значение строки переменного «FilePath» таким образом, что оно должно принять развитие (например, c: \ project \ target \ mapping.properties)
Я пробовал силовые механизмы в юнитах, но он всегда выдает исключение и заканчивается.
аннотаций на уровне класса:
@RunWith(PowerMockRunner.class)
@SuppressStaticInitializationFor("some.package.ClassWithStaticInit")
и в тесте:
Whitebox.setInternalState(Mappingloader.class, "filepath", testfilepath);
Mappingloader.loadMappingFile();
Я также попытался изменить это с помощью отражения, как указано в (Change private static final field using Java reflection), но он всегда бросает FileNotFoundException для " filepath "и не принимает измененный путь" testFilePath "
Есть ли способ изменить эту переменную так, чтобы она не бросала FileNo tFoundException без каких-либо изменений в исходном коде?
Если я удалю "throw new RuntimeException (e);" в исходном коде для меня работают силовые машины. но я хочу достичь этого без изменения исходного кода, либо через powermock, отражение api.
Отличный отклик! Я полностью согласен с тем, как разработать тестируемый код. И даже больше: как только у вас есть реальная, многоразовая и проверяемая абстракция для чтения любого файла свойств, нет возражений, чтобы статический фасад читал конкретный файл. (Если абстракция была полностью протестирована, нет необходимости проверять фасад.) –
Добро пожаловать. – GhostCat
@GhostCat, все, что вы сказали, хорошо думает и как оно должно быть. Но вы не сказали, как это может быть достигнуто, когда у разработчика уже есть такой код, и, возможно, это часть библиотеки, которая не может быть изменена. Конечно, разработчик должен следовать всем этим принципам, избегать использования статических и т. Д., И так далее, но когда проект запускается с нуля. Если код не покрывается тестом - внесите изменения, это не очень хорошая идея. –