Почему мне нужно добавить метод в интерфейс Java, чтобы получить доступ к нему в модульном тесте Junit? - PullRequest
0 голосов
/ 16 октября 2019

Я в основном разработчик на C #, .NET и привык к интерфейсам и TDD в C #. Интерфейсы в C # в первую очередь определяют контракт при реализации. Использование кажется немного другим в Java. В частности, кажется, что каждый проект, с которым я сталкивался, реализует базовый интерфейс для доступа к приложению, как если бы всегда требовало, чтобы любое приложение Java использовало интерфейс. Я думаю, что мне не хватает некоторого базового понимания, поэтому я действительно буду признателен за любые подсказки для хорошего учебника, который я могу прочитать.

Например, у меня есть тест, который выглядит так (в отдельномПапка «Test» в моем решении):

Tests.java

package com.dius.bowling;

class DiusBowlingGameTest {

    private BowlingGame bowlingGame;

    @BeforeEach
    void setUp() {
        this.bowlingGame = new DiusBowlingGame();
        this.bowlingGame.startGame();
    }

Чтобы получить доступ к this.bowlingGame.startGame(); Мне нужно добавить метод в интерфейс,Почему? Кажется, есть разница между Java и C # / .NET, о которой я не знаю?

Интерфейс

package com.dius.bowling;

/**
 * Interface for a bowling game.
 */
public interface BowlingGame {
    /**
     * roll method specifying how many pins have been knocked down
     * @param noOfPins no. of pins knocked down
     */
    void roll(int noOfPins);

    /**
     * get player's current score
     * @return player's current score
     */
    int score();

    void startGame();
}

DiusBowlingGame

package com.dius.bowling;

/**
 * Scoring system for tenpin bowls
 */
public class DiusBowlingGame implements BowlingGame {

    ArrayList<BowlingFrame> gameFrames = new ArrayList<BowlingFrame>();

    public void roll (int noOfPins) {

       /* Implementation */
    }

    }

    /**
     * Activate the 1st frame of the game
     */
    public void startGame() {
        advanceFrame();
    };

Ответы [ 2 ]

4 голосов
/ 16 октября 2019

Если его нет в интерфейсе, и вы храните ссылку в переменной типа интерфейса, как компилятор узнает, что метод существует?

В общем случае значение, назначенное переменной, может быть любымреализация BowlingGame. Если метод не находится в интерфейсе, эти классы не требуют реализации метода.

Чтобы избежать добавления метода в интерфейс, либо измените тип переменной на DiusBowlingGame, либо используйте локальную переменнуюв методе setUp:

DiusBowlingGame bowlingGame = new DiusBowlingGame();
bowlingGame.startGame();
this.bowlingGame = bowlingGame;
1 голос
/ 16 октября 2019

Насколько я знаю, интерфейсы работают одинаково в C # и Java. Единственные различия заключаются в том, что в C # обычно имена интерфейсов называются «I», а в C # и классы, и взаимодействия используют оператор :, тогда как в Java ключевое слово implements используется для интерфейса,ключевое слово extends используется для занятий. Ваш код не нуждается в интерфейсе, он будет отлично работать и так:

package com.dius.bowling;

class DiusBowlingGameTest {

private DiusBowlingGame bowlingGame;

@BeforeEach
void setUp() {
    this.bowlingGame = new DiusBowlingGame();
    this.bowlingGame.startGame();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...