Как автоматически импортировать методы для тестирования с помощью junit в Intellij - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь научиться использовать junit4 для тестирования в Intellij, чтобы попрактиковаться в вопросах алгоритма в CTCI и leetcode. Однако, когда я создаю тест, мне нужно вручную импортировать каждый метод для тестирования, а не импортировать весь класс и получать все методы вместе с ним. Вот пример класса в моей папке src:

package leetcode;

public class JewelsAndStones{

  /*Simple brute force method using nested for loops*/

  public static int findJewelsInStonesBruteForce(String J, String S){
    char[] jewelChars = J.toCharArray();
    char[] stoneChars = S.toCharArray();
    int count = 0;
    for (char jewel : jewelChars) {
      for (char stone: stoneChars) {
        if (jewel == stone) {
          count ++;
        }
      }
    }
    return count;
  }
}

и вот класс теста, расположенный в папке теста:

package leetcode;
import org.junit.*;
import static junit.framework.TestCase.assertEquals;
import static leetcode.JewelsAndStones.findJewelsInStonesBruteForce;


public class JewelsAndStonesTest {

  @Test
  public void testFindJewelsInStones() throws Exception {
    String J = "aA";
    String S = "aaAbbbb";
    assertEquals(3, findJewelsInStonesBruteForce(J,S));
  }
  @Test
  public void testFindJewelsInStonesBadInput() throws Exception {

  }
}

Так что для класса, где у меня может быть 3 разных метода решения, нужно ли мне делать import static leetcode.JewelsAndStones.*additonalMethodToTest* для каждого? использование import static leetcode.JewelsAndStones.* или еще лучше import static leetcode.* не работает.

1 Ответ

0 голосов
/ 17 мая 2018

Установите курсор на имя класса, нажмите Alt + Введите и выберите «Создать тест» во всплывающем меню.Затем проверьте все методы, которые вы хотите протестировать, и Idea создаст для вас тестовый класс со всеми заглушками методов.

UPD: Я хотел бы добавить, что нет никакой причины делать ваши методы статичными вообще.Просто публично:

public int findJewelsInStones(String J, String S) {
  ...
}

Тогда ваш тестовый код должен выглядеть примерно так:

@Test
public void testFindJewelsInStones() throws Exception {
  // Given
  JewelsAndStones jewelAndStones = new JewelsAndStone();
  String J = "aA";
  String S = "aaAbbbb";
  int expected = 3;

  // When
  int result = jewelAndStones.findJewelsInStones(J, S);

  // Then 
  assertEquals(expected, result);
}

В этом случае вам не нужно выполнять статический импорт методов.

В дополнение к этому вы также можете использовать подход, основанный на данных.Поскольку валидатор leetcode использует тестовые примеры для проверки ваших методов, вы также можете положиться на эти тестовые примеры.Вот небольшой пример параметризованного теста с сопоставителями подколенного сухожилия:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;

import java.util.Arrays;
import java.util.Collection;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;

@RunWith(Parameterized.class)
public class JewelsAndStonesTest {
    private String J;
    private String S;
    private int expected;

    public JewelsAndStonesTest(String J, String S, int expected) {
        this.J = J;
        this.S = S;
        this.expected = expected;
    }

    @Parameterized.Parameters(name = "{index}: J=\"{0}\", S=\"{1}\", expected result: {2}")
    public static Collection<Object[]> testCases() {
        return Arrays.asList(new Object[][] {
            {"aA", "aaAbbb", 3}, 
            {"z", "ZZ", 0}
            // add more test cases here: positive and negative 
        });
    }

    @Test
    public void jewelsAndStonesTestSuite() {
       // Given
       JewelsAndStones jewelAndStones = new JewelsAndStone();

       // When 
       int result = jewelAndStones.findJewelsInStones(J, S);

       // Then
       assertThat(result, is(equalTo(expected)));
    }
}
...