pracuję projekt o strukturze podobnej do tego, co pan wspomniał. Umieściłem wszystkie moje odpowiedzi serwera w pliku pod folderem resources
, takim jak app/src/test/resources/BookingInfo.json
.
Wszystkie pliki testowe java są pod app/src/test/java/PACKAGE_NAME
podobne do tego, co powiedziałeś. Mam klasy Fixture
w ramach pakietu, który zawiera nazwę zasobów:
@SuppressWarnings("nls")
public final class Fixtures
{
public static final String GET_ANNOUNCEMENT = "GetAnnouncement.json";
...
}
i wreszcie klasę FixtureUtils że metoda tej klasy jest odpowiedzialny, aby przeczytać plik zasobów i powrócić wynik.
import java.nio.file.Files;
import java.nio.file.Paths;
public class FixtureUtils
{
public static final AFixture fixtureFromName(final String fixtureName)
{
final String fixtureString = FixtureUtils.stringFromAsset(fixtureName);
if (StringUtils.isEmpty(fixtureString))
{
return null;
}
final Gson gson = new Gson();
final AFixture aFixture = gson.fromJson(fixtureString, AFixture.class);
return aFixture;
}
private static final String stringFromAsset(final String filename)
{
try
{
final URL resourceURL = ClassLoader.getSystemResource(filename);
if (resourceURL == null)
{
return null;
}
final String result = new String(Files.readAllBytes(Paths.get(resourceURL.toURI())),
Charset.forName("UTF-8")); //$NON-NLS-1$
return result;
}
catch (final Exception e)
{
e.printStackTrace();
}
return null;
}
private FixtureUtils()
{
// Ensure Singleton
}
}
I AFixture
klasy wygląda następująco:
public class AFixture
{
public List<JsonElement> validItems;
public List<JsonElement> invalidItems;
public AFixture()
{
super();
}
public List<JsonElement> getInvalidItems()
{
return this.invalidItems;
}
public List<JsonElement> getValidItems()
{
return this.validItems;
}
public void setInvalidItems(final List<JsonElement> invalidItems)
{
this.invalidItems = invalidItems;
}
public void setValidItems(final List<JsonElement> validItems)
{
this.validItems = validItems;
}
}
Uwaga: java.nio.file
została usunięta z JDK8 jeśli się nie mylę jednak nie masz problemu, jeśli używasz JDK7. Jeśli używasz JDK8, po prostu musisz zmienić metodę stringFromAsset
w taki sposób, jak FileInputStream (stary styl mody) lub Scanner.
Myślę, że potrzebowalibyśmy więcej kodu dla myClass.java, aby to skomentować. Chcesz przetestować przekazanie pliku testFile.txt do dowolnej metody przetwarzającej pliki tekstowe w myClass, a następnie sprawdź (assert with AssertJ), czy wynik wraca zgodnie z oczekiwaniami. Zaglądanie do Robolectric i Mockito może dać ci kilka pomysłów. – TTransmit
'myClass.java' nie ma znaczenia. Załóżmy, że ma metodę, która zużywa 'InputStream' i chcę, aby strumień zawierał zawartość pliku w moim teście. Czy to ma sens? –
jeśli chcesz coś z tym zrobić, przeczytaj [Mój wpis] (http://stackoverflow.com/questions/28206507/getting-list-of-subfolders-name-and-files-name-in-android- pakiet źródłowy). możesz otworzyć apk w swoim telefonie komórkowym, a następnie odczytać go jako strumień. –