Я использую @Mock в Java

Использовав @Mock я @Test оно не функционирует, хотя санкционируя через простой debug оно функционирует completamanete, я не понимаю, как использовать Mocks, и то, что я тестирую, очень простое:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
public class SepaRoutingFromXMLTest {

    @Mock
    SepaRoutingUtils sepa;

    @Test
    public void existValidOneFullXMLFileInFolder() throws Exception {
        assertThat("ARCHIVE_20141224.xml", containsString(".xml"));
        assertThat(sepa.readSepaXMLFile(), containsString("ARCHIVE_"));
    }

}

Первый assertThat функционируй без проблемы он очень основной, однако второй, который видимо равен тривиального, возвращает меня:

Expected: a string containing "SEPAROUTING_V3_FULL_" but: was null

Поскольку возможно видеть, я делаю mock:

@Component
public class SepaRoutingUtils {

    public String readSepaXMLFile() {
        return "ARCHIVE_20141224.xml";
    }

}

Что для меня является главным образом тем же самым, но я догадываюсь, что я не понимаю функционирование @Mock и также не могу делать один @Autowired из этого класса, потому что я думаю, что не нужно делать в @Test.

Я вижу, что, сделав следующее изменение, оно функционирует правильно:

@RunWith(SpringRunner.class)
public class SepaRoutingFromXMLTest {

    @Test
    public void existValidOneFullXMLFileInFolder() throws Exception {
        SepaRoutingUtils sepa = new SepaRoutingUtils(); 
        assertThat(sepa.readSepaXMLFile(), containsString(".xml"));
        assertThat(sepa.readSepaXMLFile(), containsString("ARCHIVE_"));
    }

}

Однако делать это не подает меня, потому что в classe SepaRoutingUtils я должен получать стоимость с @Value:

@Value("${from.folder}")
private String FROM_FOLDER;

Я знаю, что могут не попасть в меня, и несколько концепций.

Обновление класса SepaRoutingUtils

@Component
public class SepaRoutingUtils {

    @Value("${from.folder}")
    private String FROM_FOLDER;

    private File readSepaFolder() {

        File folder = new File(FROM_FOLDER);
        if(!folder.isDirectory()) {
            throw new FolderAccessDeniedException();
        }

        return folder;
    }

    public String readSepaXMLFile(SepaRoutingFileType fileType) {

        try {
            return Utils.prepareXMLFile(readSepaFolder(), fileType).getName();
        }
        catch (ParseException e) {
            e.printStackTrace();
            throw new NotValidFileException();      
        }

    }

}
0
задан 18.08.2019, 09:49
2 ответа

Дополняя правильный ответ в общих условиях @SJuan76.

Для твоего случая в особенности ты хочешь реализовать лишенный mock члена в, которого тебя не может делать ему @Mock/@Spy, из-за того, что - конечный класс (String)

возможное решение, он мог бы состоять в том, чтобы использовать reflection , чтобы добавлять проверяемую стоимость к этому String:

import org.springframework.util.ReflectionUtils;

@RunWith(MockitoJUnitRunner.class)
public class SepaRoutingUtilsTest {

    @InjectMocks
    private SepaRoutingUtils sepa;

    @Before
    public void setUp() throws NoSuchFieldException {
        Field field = SepaRoutingUtils.class.getDeclaredField("FROM_FOLDER");
        ReflectionUtils.makeAccessible(field);
        ReflectionUtils.setField(field, sepa, "ARCHIVE_20141224.xml");
    }

    @Test
    public void existValidOneFullXMLFileInFolder() throws Exception {
        assertThat("ARCHIVE_20141224.xml", containsString(".xml"));
        assertThat(sepa.readSepaXMLFile(), containsString("ARCHIVE_"));
    }

}
3
ответ дан 03.12.2019, 06:38
  • 1
    Нет, оно я не функционирует а именно cambié Autowired из-за @InjectMocks, но все же я должен поддерживать свойство как свойство класса и не могу перемещать ее с Оцените. Он extrañ или потому что у меня есть другие классы в том же пакете и главном записанном классе с SpringBootApplication и в базовом пакете applicacion. – AndreFontaine 19.03.2018, 17:21
  • 2
    Но я не сказал тебе, чтобы ты удалил свойство, только я показал тебе, как перемещать его стоимость во время реализации теста – Klaimmore 19.03.2018, 17:27
  • 3
    Сейчас, если я понял то, что ты говоришь мне, и он оказывается очень могущественным, однако стоимость продолжает теряться например, если я делаю File folder = new File(FROM_FOLDER);, дает мне NullPointerException. – AndreFontaine 19.03.2018, 17:41
  • 4
    Tendrí в который видеть có я говорю, что эти testiando, чтобы это понимать. В каком комментарии ты делаешь new? – Klaimmore 19.03.2018, 17:52
  • 5
    Я обновил класс, сделав File folder = new File(FROM_FOLDER);, и который быть должен выполнять тест, он дает мне NullPointerException. – AndreFontaine 19.03.2018, 17:56

Ты делаешь mocks, чтобы заменять компоненты, от которых зависит cГіdigo, который ты тестируешь. AsГ - ты можешь тестировать компонент, не завися от, если замененные компоненты функционируют правильно или нет.

Твой компонент делает таким, что asГ - 1 :

public MiComponente {
   @Autowired MiComponentePersistencia persistencia;

   public int getSuma(String param) {
      int[] datos = persistencia.getNumeros(param);
      int resultado = 0;
      for (int dato : datos) {
         resultado += dato;
      }
      return resultado;
   }
}

ВїCГіmo ты тестируешь getSuma()? Стоимость, которую ты получаешь dependerГЎ от того, что persistencia.getNumeros() возвращает тебе, asГ - что, если ты это не контролируешь не podrГЎs, делать тест (или по крайней мере, не podrГЎs санкционировать результат).

AsГ - что

@Mock
MiComponentePersistencia persistencia;

@InjectMocks
MiComponente compAProbar;

@Test
public void testSuma() {
   when (persistencia.getNumeros("hola")).thenReturn(new int[]{1, 2});
   assertEquals("Valor de la suma", 3, compAProbar.getSuma("hola"));
}

И sГ, - podrГ-схвати просто делать ты implementaciГіn "в руку" MiComponentePersistencia, чтобы делать то же самое. frameworks mock просто облегчают тебе задание много.


1 Действительно у меня есть mГЎs опыт с Java США и Mockito, что со Спринг, asГ, - что я disculparГЎs, если что-то из Спринг полностью не правильна.

1
ответ дан 03.12.2019, 06:38