JUnit, metoda zwracająca nowy obiekt.

0

Całkowicie nowy w testach jednostkowych.

W jaki sposób powinno się testować metody które zwracają obiekty na zasadzie metoda... return new Klasa?
Dla zobrazowania klasa:

    public class A {
        int mX;
        int mY;
        int mWidth;
        int mHeight;

        public A (int x, int y, int width, int height) {
            mX = x;
            mY = y;
            mWidth = width;
            mHeight = height;
        }

        public Rect getRectangle() {
            return new Rect(
                    (int)(mX + 0.1*mWidth),
                    (int)(mY + 0.1*mHeight),
                    (int)(mX + 0.9*mWidth),
                    (int)(mY + 0.9*mHeight));
        }
    }

Wartości x, y, width, height w testach oczywiście są przeze mnie określone, klasa A zainicjowana.
Problem polega na tym, że gdy w jakikolwiek sposób metoda getRectangle() jest przeze mnie wywołana w metodach testowych, zwraca ona null zamiast obiektu Rect.
Całkowicie zielony w testach. Pierwszy dzień grzebania:).

0

Problem polega na tym, że gdy w jakikolwiek sposób metoda getRectangle() jest przeze mnie wywołana w metodach testowych, zwraca ona null zamiast obiektu Rect.

Niemożliwe. Pokaż konkretny kod który nie działa.

0

Może trochę za bardzo uprościłem pisząc powyżej. Wstawiam kod, uproszczony jak się da:

Klasa testowana ( superklasa moich innych klas, ale chciałbym ją przetestować):

public abstract class GameBaseObject implements Comparable<GameBaseObject> {
    protected int mX;
    protected int mY;
    protected int mWidth;
    protected int mHeight;

    GameBaseObject(ObjectParameters p) {
        mX = p.getX();
        mY = p.getY();
        mWidth = p.getWidth();
        mHeight = p.getHeight();
    }

    public Rect getRectangle() {
        return new Rect(
                (int)(mX + 0.1*mWidth),
                (int)(mY + 0.1*mHeight),
                (int)(mX + 0.9*mWidth),
                (int)(mY + 0.9*mHeight));
    }
}

Klasa ObjectParameters to prosty wrapper na parametry. Zostawiłem tylko to, co potrzebne do zainicjowania Rect. Instancję tej klasy w klasie testowej dodaję jako @mock ( źródło problemu?).

public class ObjectParameters {
    private int x;
    private int y;
    private int width;
    private int height;
     ...

    public ObjectParameters(...) {
     ...
    }
    
    // gettery
}

Klasa testowa:

@RunWith(MockitoJUnitRunner.class)
public class GameBaseObjectTest {

    // wrapper na parametry
    @Mock
    ObjectParameters paramObject1;

    // klasa z metodą getRectangle();
    private GameBaseObject gameObject1;

    @Before
    public void setupForTests() {
        MockitoAnnotations.initMocks(this);
        setupParams();
        initObjects();
    }

    private void setupParams() {
        when(paramObject1.getX()).thenReturn(100);
        when(paramObject1.getY()).thenReturn(100);
        when(paramObject1.getWidth()).thenReturn(100);
        when(paramObject1.getHeight()).thenReturn(100);
    }

    private void initObjects() {
        gameObject1 = new GameBaseObject(paramObject1) {};
       // najprościej jak się da, sprawdzenie pól ( nie testy, ale żeby sprawdzić w samych testach;)
        System.out.println(gameObject1.mX);
        System.out.println(gameObject1.mY);
        System.out.println(gameObject1.mWidth);
        System.out.println(gameObject1.mHeight);
        ( konsola zwraca 100, 100, 100, 100)

        System.out.println(gameObject1.getRectangle);
        ( konsola zwraca null ??)
    }


    @Test
    public void getRect_ShouldReturnRectSmallerThanObject() {
        assertFalse(gameObject1.getRectangle().contains(gameObject1.mX, gameObject1.mY));
    }
}

W pierwszej chwili pomyślałem, że to wina tego, że testowana klasa jest abstract. Ale w testach można ją zainicjować (?).
Drugim podejrzanym miejscem był dla mnie ten wrapper @mock na parametry, ale w sprawdzeniu z tymi System.out... zwracane są dobre wartości pól klasy.
Z jakiegoś powodu te pola są "niewykryte" w metodzie getRectangle().
Może jest tutaj coś oczywistego, ale jak pisałem, pierwszy dzień grzebania i z tego powodu takie problemy mam.

1
Błękitny Samiec napisał(a):
    System.out.println(gameObject1.getRectangle);
    ( konsola zwraca null ??)

Może nie jestem Javowcem, ale czy nie brakuje Ci nawiasów ?

getRectangle()
1

To: gameObject1.getRectangle jest odwołanie do publicznego pola a nie wywołanie metody. Takiego pola co prawda nie ma, ale zrobiłeś tzw "nice mock" który na wszystko czego "nie zna" reaguje nullem ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1