package cucumber.runtime.java;
import cucumber.api.java.Before;
import cucumber.api.java.ObjectFactory;
import cucumber.runtime.CucumberException;
import cucumber.runtime.Glue;
import cucumber.runtime.io.MultiLoader;
import cucumber.runtime.io.ResourceLoader;
import cucumber.runtime.io.ResourceLoaderClassFinder;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.internal.util.reflection.Whitebox;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.fail;
import static org.mockito.Mockito.*;
public class MethodScannerTest {
@Test
public void loadGlue_registers_the_methods_declaring_class_in_the_object_factory() throws NoSuchMethodException {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
ResourceLoader resourceLoader = new MultiLoader(classLoader);
MethodScanner methodScanner = new MethodScanner(new ResourceLoaderClassFinder(resourceLoader, classLoader));
ObjectFactory factory = Mockito.mock(ObjectFactory.class);
Glue world = Mockito.mock(Glue.class);
JavaBackend backend = new JavaBackend(factory);
Whitebox.setInternalState(backend, "glue", world);
// this delegates to methodScanner.scan which we test
methodScanner.scan(backend, BaseStepDefs.class.getMethod("m"), BaseStepDefs.class);
verify(factory, times(1)).addClass(BaseStepDefs.class);
verifyNoMoreInteractions(factory);
}
@Test
public void loadGlue_fails_when_class_is_not_method_declaring_class() throws NoSuchMethodException {
JavaBackend backend = new JavaBackend((ObjectFactory) null);
try {
backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), Stepdefs2.class);
fail();
} catch (CucumberException e) {
assertEquals("You're not allowed to extend classes that define Step Definitions or hooks. class cucumber.runtime.java.MethodScannerTest$Stepdefs2 extends class cucumber.runtime.java.MethodScannerTest$BaseStepDefs", e.getMessage());
}
}
@Test
public void loadGlue_fails_when_class_is_not_subclass_of_declaring_class() throws NoSuchMethodException {
JavaBackend backend = new JavaBackend((ObjectFactory) null);
try {
backend.loadGlue(null, BaseStepDefs.class.getMethod("m"), String.class);
fail();
} catch (CucumberException e) {
assertEquals("class cucumber.runtime.java.MethodScannerTest$BaseStepDefs isn't assignable from class java.lang.String", e.getMessage());
}
}
public static class Stepdefs2 extends BaseStepDefs {
public interface Interface1 {
}
}
public static class BaseStepDefs {
@Before
public void m() {
}
}
}