Pourquoi suis-je une Exception avec le message “Invalid configuration sur un non-virtuel (substituables en VB) membre...”?
J'ai une unité de test où je dois simuler une non-méthode virtuelle qui renvoie un type bool
public class XmlCupboardAccess
{
public bool IsDataEntityInXmlCupboard(string dataId,
out string nameInCupboard,
out string refTypeInCupboard,
string nameTemplate = null)
{
return IsDataEntityInXmlCupboard(_theDb, dataId, out nameInCupboard, out refTypeInCupboard, nameTemplate);
}
}
J'ai donc un objet fantaisie de XmlCupboardAccess
classe et je suis en train de configuration se moquer de cette méthode dans mon cas de test comme indiqué ci-dessous
[TestMethod]
Public void Test()
{
private string temp1;
private string temp2;
private Mock<XmlCupboardAccess> _xmlCupboardAccess = new Mock<XmlCupboardAccess>();
_xmlCupboardAccess.Setup(x => x.IsDataEntityInXmlCupboard(It.IsAny<string>(), out temp1, out temp2, It.IsAny<string>())).Returns(false);
//exception is thrown by this line of code
}
Mais cette ligne throws exception
Invalid setup on a non-virtual (overridable in VB) member:
x => x.IsDataEntityInXmlCupboard(It.IsAny<String>(), .temp1, .temp2,
It.IsAny<String>())
Toute suggestion comment obtenir autour de cette exception?
- Ce qui, dans votre test dépend
XmlCupboardAccess
? - sa simple.. vous devez marquer
virtual
. Moq ne peut pas se moquer d'un type de béton qu'il ne peut pas remplacer.
Vous devez vous connecter pour publier un commentaire.
Moq ne peut pas se moquer de non-méthodes virtuelles et classes scellées. Lors de l'exécution d'un test à l'aide d'un objet fantaisie, MOQ crée en fait une mémoire de type de proxy qui hérite de votre "XmlCupboardAccess" et remplace les comportements que vous avez défini dans le "SetUp" de la méthode. Et comme vous le savez en C#, vous pouvez remplacer quelque chose seulement si il est marqué comme virtuel qui n'est pas le cas avec Java. Java présume que tous les non-statique méthode virtuelle par défaut.
Autre chose, je crois que vous devriez considérer est l'introduction d'une interface pour votre "CupboardAccess" et de commencer à se moquant de l'interface à la place. Il serait de vous aider à découpler votre code et avoir des avantages dans le long terme.
Enfin, il existe des frameworks comme : TypeMock et JustMock qui travaillent directement avec le IL et peut donc se moquer de non-méthodes virtuelles. Les deux cas, cependant, sont des produits commerciaux.
Que l'aide à quelqu'un qui avait le même problème que moi, j'ai accidentellement fait une faute de frappe à la mise en œuvre type, au lieu de l'interface, par exemple
au lieu de
Veuillez voir
Pourquoi le bien que je veux pour se moquer besoin d'être virtuel?
Vous devrez écrire un wrapper de l'interface ou de la marque de la propriété virtuelle/abstrait comme Moq crée une classe proxy qu'il utilise pour intercepter les appels et retour de vos valeurs personnelles que vous mettez dans le
.Returns(x)
appel.Vous obtiendrez cette erreur ainsi si vous êtes de vérifier qu'une méthode d'extension d'une interface est appelée.
Par exemple, si vous êtes moqueur:
Vous obtiendrez la même exception, car
.ValidateAndThrow()
est une extension sur leIValidator<T>
interface.public static void ValidateAndThrow<T>(this IValidator<T> validator, T instance, string ruleSet = null)...
Au lieu de se moquer de la classe de béton, vous devriez se moquer de la classe de l'interface.
Extrait de l'interface à partir de XmlCupboardAccess classe
Et au lieu de
changement de
Code:
mais voir l'exception.